// Figure7_1
// Based on the regular expression:
// 0*10* 
//
import Expr;
import java.io.*;
import javax.swing.JOptionPane;

public class Figure7_1 
{

public static void main(String [] args)
	{	
	String reString = new String();
	String actionString = new String();
	String filename = new String();
	reString = r(1,2,0).reduce().toString() + " + " + r(1,2,1).reduce().toString() + " + " + r(1,2,2).reduce().toString();
    filename = JOptionPane.showInputDialog("Enter a file name (for lex input)");
    actionString = JOptionPane.showInputDialog("Enter an action for this NFA");
	System.out.println(reString);	

	PrintWriter lexfile = null;
	try 
	{
		lexfile = new PrintWriter(new FileOutputStream(filename));
	}
	catch(FileNotFoundException ex)
	{
		System.out.println("Error opening the output file");
		System.exit(0);	
	}
	String eol = null;
	lexfile.println("%%");
	lexfile.println(reString + " " + actionString);
	lexfile.println("%%");
	lexfile.close();
	System.exit(0);
	}


public  static Expr r(int i, int j, int k)
{

	if (k == 0)
		if(i == 1 && j == 1)
			return new Star(new Alpha(new Character('0')));
			
	if (k == 0)
		if(i == 1 && j == 2)
		 	return new Alpha(new Character('1'));
		 
	if (k == 0)
		if(i == 1 && j == 3)
		 return new Empty();

	if (k == 0)
		if(i == 2 && j == 1)
		 return new Empty();

	if (k == 0)
		if(i == 2 && j == 2)
			return new Star(new Alpha(new Character ('0')));
		  	
	if (k == 0)
		if(i == 2 && j == 3)
		 return new Empty();

	if (k == 0)
		if(i == 3 && j == 1)
		 return new Empty();

	if (k == 0)
		if(i == 3 && j == 2)
		 return new Empty();	
		 
 	if (k == 0)
		if(i == 3 && j == 3)
		 return new Union(new Epsilon(), new Union(new Alpha(new Character('0')), new Alpha(new Character('1'))));

	if (k != 0)
		{
		return new Union(new Concat((new Concat(r(i,k,k-1).reduce(), new Star(r(k,k,k-1).reduce())).reduce()), r(k,j,k-1).reduce()).reduce().reduce(), r(i,j,k-1)).reduce();	     
		}

	// should never get here, but include it to keep the compiler happy
	return new Epsilon();
}
}
