package project.ec;
import project.nfa.NFA;
import project.nfa.NFAUtil;
import project.nfa.State;
import project.nfa.Transition;
import javax.swing.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
/**
* Created with IntelliJ IDEA.
* User: toriscope
*/
public class ExtraCredit {
// statename(*) | trans| state| trans| state ... \n
// || empty trans
public static void main(String[] args) {
File inputFile = null;
if (args.length > 0) {
inputFile = new File(args[0]);
} else {
JFileChooser fileChooser = new JFileChooser("Choose NFA formatted input file");
int result = fileChooser.showOpenDialog(null);
if (result != JFileChooser.APPROVE_OPTION) {
System.exit(1);
} else {
inputFile = fileChooser.getSelectedFile();
}
}
Scanner scannerInput = null;
try {
scannerInput = new Scanner(inputFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
HashMap<String, project.nfa.State> nameToState = new HashMap<String, project.nfa.State>();
HashMap<State, List<String[]>> stateToTrans = new HashMap<State, List<String[]>>();
List<String> testStrings = new LinkedList<String>();
State startState = null;
while (scannerInput.hasNextLine()) {
String stateInfo = scannerInput.nextLine();
String[] info = stateInfo.split("\\|");
if (stateInfo.trim().isEmpty()) {
continue;
}
// Trim everything
for (int i = 0; i < info.length; i++) {
info[i] = info[i].trim();
}
if (info[0].startsWith("#")) {
continue;
}
if (info[0].startsWith("$")) {
testStrings.add(stateInfo.replaceFirst("\\$", "").trim());
continue;
}
boolean isFinal = info[0].charAt(info[0].length() - 1) == '*';
if (isFinal) {
info[0] = info[0].substring(0, info[0].length() - 1);
}
State state = new State(info[0], isFinal);
if (startState == null && nameToState.isEmpty()) {
startState = state;
}
nameToState.put(info[0], state);
List<String[]> trans = new LinkedList<String[]>();
for (int i = 1; i < info.length; i += 2) {
trans.add(new String[]{info[i], info[i + 1]});
}
stateToTrans.put(state, trans);
}
for (Map.Entry<String, State> entry : nameToState.entrySet()) {
if (stateToTrans.get(entry.getValue()) != null)
for (String[] transTuple : stateToTrans.get(entry.getValue())) {
boolean isEmpty = transTuple[0].isEmpty();
Transition transition = new Transition(transTuple[0], nameToState.get(transTuple[1]));
transition.setIsEmptyTransition(isEmpty);
entry.getValue().addTransition(transition);
}
}
NFA nfa = new NFA(startState);
System.out.println(nfa);
System.out.print("NFA Tests:\n");
for (String test : testStrings) {
System.out.println("\nResults for: " + test);
System.out.println(NFAUtil.isValidVerbose(nfa, test));
}
System.out.println("\n---\nDFA Tests:\n");
nfa = NFAUtil.convertToDFA(NFAUtil.convertToDFA(nfa));
System.out.println(nfa);
for (String test : testStrings) {
System.out.println("\nResults for: " + test);
System.out.println( NFAUtil.isValidVerbose(nfa, test));
}
/*System.out.print("\nDFA (Minimized) Tests:\n");
NFAUtil.minimizeDFA(nfa);
System.out.println(nfa);
for (String test : testStrings) {
System.out.println("\nResults for: " + test);
System.out.println(NFAUtil.isValidVerbose(nfa, test));
}*/
}
}