Hi guys..
I am currenly coding a program which outputs the next state table for flip flop circuits.
I have already finished the the generator for one type of flip flop, and I have 3 more to go..

So far, my arithmetic parser is working good but I suddenly remembered that it is included in our specifications that the user could also input XOR operations, which my parser couldn't handle.

So now,
I am looking for existing codes in expanding XOR equations so that the expanded equation would just be the one to be substituted and processed by the parser.

like this one:
/*XOR = & */
(A&(B&C)) = ABC + A'B'C' + A'B'C + A'BC + AB'C' + ABC'


If you want to see my program, here it is:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


/**
 * @author Jenielle Gabriel
 *
 */
public class FFGen extends JFrame{
	
	private String FlipflopType = "";
	private boolean isOneFlipflop = true;
	private boolean isInput = false;
	private boolean isOutput = false;
	
	String JAEquation = "";
	String KAEquation = "";
	String JBEquation = "";
	String KBEquation = "";
	String OutputEquation = "";
	
	JFrame first;
	JFrame JKFrame;
	JFrame JKTableFrame;
	
	public void First(){
		
		/**
		 * @param args
		 */
		JLabel pleaseChooseFFType;
		String[] FlipflopTypes = {"JK", "RS", "D", "T"};; 
		JComboBox FlipflopList;
		
		JLabel pleaseChooseFFNum;
		ButtonGroup FlipflopNumberGroup;
		JRadioButtonMenuItem oneFlipflop;
		JRadioButtonMenuItem twoFlipflop;
		
		JLabel pleaseCheck;
		JCheckBox oneInput;
		JCheckBox oneOutput;
		
		JButton next;
		
		
		JPanel firstConLeft;
		JPanel firstConRight;
	
		FlipflopList = new JComboBox(FlipflopTypes);
		FlipflopList.addActionListener(
				new ActionListener(){
					public void actionPerformed(ActionEvent e){
						JComboBox cb = (JComboBox)e.getSource();
				        FlipflopType = (String)cb.getSelectedItem();
					}
				}
		);
		
		pleaseChooseFFType = new JLabel("Type of Flipflop:");
		oneFlipflop = new JRadioButtonMenuItem ("1");
		oneFlipflop.addActionListener(
				new ActionListener(){
					public void  actionPerformed(ActionEvent e){
						isOneFlipflop = true;
					}
				}
		);
		twoFlipflop = new JRadioButtonMenuItem ("2");
		twoFlipflop.addActionListener(
				new ActionListener(){
					public void  actionPerformed(ActionEvent e){
						isOneFlipflop = false;
					}
				}
		);
		
		pleaseChooseFFNum = new JLabel("Number of Flipflops:");
		FlipflopNumberGroup = new ButtonGroup();
		FlipflopNumberGroup.add(oneFlipflop);
		FlipflopNumberGroup.add(twoFlipflop);
		
		pleaseCheck = new JLabel("There is an:");
		oneInput = new JCheckBox ("Input");
		oneInput.addItemListener(
				new ItemListener(){
					public void itemStateChanged(ItemEvent e) {
						if (e.getStateChange() == ItemEvent.SELECTED)
							isInput = true;
						else if (e.getStateChange() == ItemEvent.DESELECTED)
					    	isInput = false;
					}
				}
		);
		
		oneOutput = new JCheckBox ("Output");
		oneOutput.addItemListener(
				new ItemListener(){
					public void itemStateChanged(ItemEvent e) {
						if (e.getStateChange() == ItemEvent.SELECTED)
							isOutput = true;
						else if (e.getStateChange() == ItemEvent.DESELECTED)
					    	isOutput = false;
					}
				}
		);
		
		next = new JButton ("Next");
		next.addActionListener(
				new ActionListener(){
					public void actionPerformed(ActionEvent e){
						first.setVisible(false);
						if(FlipflopType == "JK")
							JK();
					}
				}
		);
		
		first =  new JFrame();
		
		firstConLeft = new JPanel();
		firstConRight = new JPanel();
		firstConRight.setLayout(new GridLayout(9,1,0,0));
		firstConRight.add(pleaseChooseFFType);
		firstConRight.add(FlipflopList);
		firstConRight.add(pleaseChooseFFNum);
		firstConRight.add(oneFlipflop);
		firstConRight.add(twoFlipflop);
		firstConRight.add(pleaseCheck);
		firstConRight.add(oneInput);
		firstConRight.add(oneOutput);
		firstConRight.add(next);
		
		JPanel Empty = new JPanel();
		Empty.setLayout(new GridLayout(1,2));
		Empty.add(firstConLeft);
		Empty.add(firstConRight);
		first.add(Empty);
		
		first.setSize(250,235);
		first.setVisible(true);
		//first.validate();
	
	}
	
	public void JK(){
		
		JKFrame = new JFrame();
		
		final JTextField JAEq = new JTextField();
		final JTextField KAEq = new JTextField();
		final JTextField JBEq = new JTextField();
		final JTextField KBEq = new JTextField();
		final JTextField OutputEq = new JTextField();
		
		JPanel JKLeftPanel = new JPanel();
		JPanel JKRightPanel = new JPanel();
		JKRightPanel.setLayout(new GridLayout(7,2));
		JKRightPanel.add(new JLabel("Enter the equations. "));
		JKRightPanel.add(new JLabel("Observe Proper Syntax."));
		JKRightPanel.add(new JLabel("JA = "));
		JKRightPanel.add(JAEq);
		JKRightPanel.add(new JLabel("KA = "));
		JKRightPanel.add(KAEq);
		JKRightPanel.add(new JLabel("JB = "));
		JKRightPanel.add(JBEq);
		JKRightPanel.add(new JLabel("KB = "));
		JKRightPanel.add(KBEq);
		JKRightPanel.add(new JLabel("Output = "));
		JKRightPanel.add(OutputEq);
		JKRightPanel.add(new JLabel("Generate: "));
		JButton next = new JButton("next");
		JKRightPanel.add(next);
		
		//disabling unneeded textfields
		if(!isOutput){
			OutputEq.setEditable(false);
		}
		if(isOneFlipflop){
			JBEq.setEditable(false);
			KBEq.setEditable(false);
		}
		
		next.addActionListener(
				new ActionListener(){
					public void actionPerformed(ActionEvent e)
					{
						KAEquation = KAEq.getText();
						JAEquation = JAEq.getText();
						JBEquation = JBEq.getText();
						KBEquation = KBEq.getText();
						OutputEquation = OutputEq.getText();
						JKFrame.setVisible(false);
						genarateJK();
					}
				}
		);
		
		JKFrame.add(JKRightPanel);
		JKFrame.setSize(250,235);
		JKFrame.setVisible(true);
	}
	
	public void genarateJK(){
		
		JKTableFrame = new JFrame();
		
		int c = 0;
		int nextA[]= {0,0,0,0,0,0,0,0};  //Storage for next state A (has default values)
		int nextB[]= {0,0,0,0,0,0,0,0};  //Storage for next state B (has default values)

		int JA[] = {0,0,0,0,0,0,0,0}; //Storage for JA Values
		int JB[] = {0,0,0,0,0,0,0,0}; //Storage for JB Values
		int KA[] = {0,0,0,0,0,0,0,0}; //Storage for KA Values
		int KB[] = {0,0,0,0,0,0,0,0}; //Storage for KB Values
		int Output[] = {0,0,0,0,0,0,0,0}; //Storage for Output Values
		String AComp = null;
		String InputComp = null;
		String subsJA = null;

		if(isOneFlipflop && !isInput && !isOutput){ // one flipflop, no input, no output
			String[] A = {"1","0"}; 
			c = 2;
			
			for(int j=0; j<c; j++){

				//Complement of A
				AComp = "";
				if(A[j] == "0")
					AComp = "1";
				else{
					AComp = "0";
				}
				
				//replace JA Formula with current value of A'
				subsJA = replace(JAEquation,"A'",AComp);
				while(!subsJA.equals(replace(JAEquation,"A'",AComp))){
					subsJA = replace(JAEquation,"A'",AComp);
				}
				
				//replace JA Formula with current value of A
				subsJA = replace(subsJA,"A",A[j]);
				while(!subsJA.equals(replace(subsJA,"A",A[j]))){
					subsJA = replace(subsJA,"A",A[j]);
				}
				
				
				//replace KA Formula with current value of A'
				String subsKA = replace(KAEquation,"A'",AComp);
				while(!subsKA.equals(replace(KAEquation,"A'",AComp))){
					subsKA = replace(KAEquation,"A'",AComp);
				}
				
				
				//replace KA Formula with current value of A
				subsKA = replace(subsKA,"A",A[j]);
				while(!subsKA.equals(replace(subsKA,"A",A[j]))){
					subsKA = replace(subsKA,"A",A[j]);
				}
				
				
				try{
					
				Parser parser =  new Parser();
				//compute the value of JA
				int computedJAValue = (int)parser.evaluate(subsJA);
				JA[j] = computedJAValue;
				
				//compute the value of KA
				int computedKAValue = (int)parser.evaluate(subsKA);
				KA[j] = computedKAValue;
				
				}catch(Exception e){
					//testlang.setText(e.getMessage());
				}
				
				if(JA[j] == 0 && KA[j] == 0){
					nextA[j] = Integer.parseInt(A[j]);
				}
				else  if(JA[j] == 0 && KA[j] == 1){
					nextA[j] = 0;
				}
				else  if(JA[j] == 1 && KA[j] == 0){
					nextA[j] = 1;
				}
				else  if(JA[j] == 1 && KA[j] == 1){
					if(A[j] == "0")
						nextA[j] = 1;
					else if(A[j] == "1")
						nextA[j] = 0;
				}
				
			}//End for loop
			JLabel a = new JLabel("<html>Present<br>States<br>"+A[0]+"<br>"+A[1]);
			a.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel b = new JLabel("<html>JA<br><br>"+JA[0]+"<br>"+JA[1]);
			b.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel cee = new JLabel("<html>KA<br><br>"+KA[0]+"<br>"+KA[1]);
			cee.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel d = new JLabel("<html>Next<br>States<br>"+nextA[0]+"<br>"+nextA[1]);
			d.setHorizontalTextPosition(JLabel.CENTER);
			
			JKTableFrame.setLayout(new GridLayout(1,4));
			JKTableFrame.add(a);
			JKTableFrame.add(b);
			JKTableFrame.add(cee);
			JKTableFrame.add(d);
			
			JKTableFrame.setSize(250,235);
			JKTableFrame.setVisible(true);
			
		}//End one flipflop, no input, no output
		
		
		else if(isOneFlipflop && isInput && !isOutput){ // one flipflop, isInput, no output
			String[] A = {"1","1","0","0"}; 
			String[] Input = {"1","1","0","0"}; 
			c = 4;
			
			for(int j=0; j<c; j++){

				//Complement of A
				AComp = "";
				if(A[j] == "0")
					AComp = "1";
				else
					AComp = "0";
				
				//complement of input
				InputComp = "";
				if(Input[j] == "0")
					InputComp = "1";
				else
					InputComp = "0";
					
				//replace JA Formula with current value of A'
				subsJA = replace(JAEquation,"A'",AComp);
				while(!subsJA.equals(replace(JAEquation,"A'",AComp))){
					subsJA = replace(JAEquation,"A'",AComp);
				}
				
				//replace JA Formula with current value of A
				subsJA = replace(subsJA,"A",A[j]);
				while(!subsJA.equals(replace(subsJA,"A",A[j]))){
				subsJA = replace(subsJA,"A",A[j]);
				}
				
				//replace x Formula with current value of x'
				subsJA = replace(subsJA,"x'",InputComp);
				while(!subsJA.equals(replace(subsJA,"x'",InputComp))){
					subsJA = replace(subsJA,"x'",InputComp);
				}
				
				//replace JA Formula with current value of x
				subsJA = replace(subsJA,"x",A[j]);
				while(!subsJA.equals(replace(subsJA,"x",A[j]))){
					subsJA = replace(subsJA,"x",A[j]);
				}
				
				
				//replace KA Formula with current value of A'
				String subsKA = replace(KAEquation,"A'",AComp);
				while(!subsKA.equals(replace(KAEquation,"A'",AComp))){
					subsKA = replace(KAEquation,"A'",AComp);
				}
				
				//replace KA Formula with current value of A
				subsKA = replace(subsKA,"A",A[j]);
				while(!subsKA.equals(replace(subsKA,"A",A[j]))){
				subsKA = replace(subsKA,"A",A[j]);
				}
				
				//replace x Formula with current value of x'
				subsKA = replace(subsKA,"x'",InputComp);
				while(!subsKA.equals(replace(subsKA,"x'",InputComp))){
					subsKA = replace(subsKA,"x'",InputComp);
				}
				
				//replace KA Formula with current value of x
				subsKA = replace(subsKA,"x",A[j]);
				while(!subsKA.equals(replace(subsKA,"x",A[j]))){
					subsKA = replace(subsKA,"x",A[j]);
				}
				
				
				
				try{
					
				Parser parser =  new Parser();
				//compute the value of JA
				int computedJAValue = (int)parser.evaluate(subsJA);
				JA[j] = computedJAValue;
				
				//compute the value of KA
				int computedKAValue = (int)parser.evaluate(subsKA);
				KA[j] = computedKAValue;
				
				}catch(Exception e){
					//testlang.setText(e.getMessage());
				}
				
				if(JA[j] == 0 && KA[j] == 0){
					nextA[j] = Integer.parseInt(A[j]);
				}
				else  if(JA[j] == 0 && KA[j] == 1){
					nextA[j] = 0;
				}
				else  if(JA[j] == 1 && KA[j] == 0){
					nextA[j] = 1;
				}
				else  if(JA[j] == 1 && KA[j] == 1){
					if(A[j] == "0")
						nextA[j] = 1;
					else if(A[j] == "1")
						nextA[j] = 0;
				}
				
			}//End for loop
			
			JLabel a = new JLabel("<html>Present<br>States<br>"+A[0]+"<br>"+A[1]+"<br>"+A[2]+"<br>"+A[3]);
			a.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel b = new JLabel("<html>JA<br><br>"+JA[0]+"<br>"+JA[1]+"<br>"+JA[2]+"<br>"+JA[3]);
			b.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel cee = new JLabel("<html>KA<br><br>"+KA[0]+"<br>"+KA[1]+"<br>"+KA[2]+"<br>"+KA[3]);
			cee.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel d = new JLabel("<html>Next<br>States<br>"+nextA[0]+"<br>"+nextA[1]+"<br>"+nextA[2]+"<br>"+nextA[3]);
			d.setHorizontalTextPosition(JLabel.CENTER);
			
			JKTableFrame.setLayout(new GridLayout(1,4));
			JKTableFrame.add(a);
			JKTableFrame.add(b);
			JKTableFrame.add(cee);
			JKTableFrame.add(d);
			
			JKTableFrame.setSize(250,235);
			JKTableFrame.setVisible(true);
			
		}//End one flipflop, isInput, no output
		
		else if(isOneFlipflop && !isInput && isOutput){ // one flipflop, no input, isOutput
			String[] A = {"1","0"}; 
			c = 2;
			
			for(int j=0; j<c; j++){

				//Complement of A
				AComp = "";
				if(A[j] == "0")
					AComp = "1";
				else{
					AComp = "0";
				}
				
				//replace JA Formula with current value of A'
				subsJA = replace(JAEquation,"A'",AComp);
				while(!subsJA.equals(replace(JAEquation,"A'",AComp))){
					subsJA = replace(JAEquation,"A'",AComp);
				}
				
				//replace JA Formula with current value of A
				subsJA = replace(subsJA,"A",A[j]);
				while(!subsJA.equals(replace(subsJA,"A",A[j]))){
					subsJA = replace(subsJA,"A",A[j]);
				}
				
				
				//replace KA Formula with current value of A'
				String subsKA = replace(KAEquation,"A'",AComp);
				while(!subsKA.equals(replace(KAEquation,"A'",AComp))){
					subsKA = replace(KAEquation,"A'",AComp);
				}
				
				
				//replace KA Formula with current value of A
				subsKA = replace(subsKA,"A",A[j]);
				while(!subsKA.equals(replace(subsKA,"A",A[j]))){
					subsKA = replace(subsKA,"A",A[j]);
				}
				
				//replace Ouput Formula with current value of A'
				String subsOutput = replace(OutputEquation,"A'",AComp);
				while(!subsOutput.equals(replace(OutputEquation,"A'",AComp))){
					subsOutput = replace(OutputEquation,"A'",AComp);
				}
				
				
				//replace Output Formula with current value of A
				subsOutput = replace(subsOutput,"A",A[j]);
				while(!subsOutput.equals(replace(subsOutput,"A",A[j]))){
					subsOutput = replace(subsOutput,"A",A[j]);
				}
				
				
				try{
					
				Parser parser =  new Parser();
				//compute the value of JA
				int computedJAValue = (int)parser.evaluate(subsJA);
				JA[j] = computedJAValue;
				
				//compute the value of KA
				int computedKAValue = (int)parser.evaluate(subsKA);
				KA[j] = computedKAValue;
				
				//compute the value of Output
				int computedOutputValue= (int)parser.evaluate(subsOutput);
				Output[j] = computedOutputValue;
				
				}catch(Exception e){
					//testlang.setText(e.getMessage());
				}
				
				if(JA[j] == 0 && KA[j] == 0){
					nextA[j] = Integer.parseInt(A[j]);
				}
				else  if(JA[j] == 0 && KA[j] == 1){
					nextA[j] = 0;
				}
				else  if(JA[j] == 1 && KA[j] == 0){
					nextA[j] = 1;
				}
				else  if(JA[j] == 1 && KA[j] == 1){
					if(A[j] == "0")
						nextA[j] = 1;
					else if(A[j] == "1")
						nextA[j] = 0;
				}
				
			}//End for loop
			JLabel a = new JLabel("<html>Present<br>States<br>"+A[0]+"<br>"+A[1]);
			a.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel b = new JLabel("<html>JA<br><br>"+JA[0]+"<br>"+JA[1]);
			b.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel cee = new JLabel("<html>KA<br><br>"+KA[0]+"<br>"+KA[1]);
			cee.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel d = new JLabel("<html>Next<br>States<br>"+nextA[0]+"<br>"+nextA[1]);
			d.setHorizontalTextPosition(JLabel.CENTER);
			
			JLabel e = new JLabel("<html>Output<br>"+Output[0]+"<br>"+Output[1]);
			e.setHorizontalTextPosition(JLabel.CENTER);
			
			JKTableFrame.setLayout(new GridLayout(1,5));
			JKTableFrame.add(a);
			JKTableFrame.add(b);
			JKTableFrame.add(cee);
			JKTableFrame.add(d);
			JKTableFrame.add(e);
			
			JKTableFrame.setSize(250,235);
			JKTableFrame.setVisible(true);
			
		}//End one flipflop, no input, isoutput
		
	}
	
	static String replace(String str, String pattern, String replace) {
        int s = 0;
        int e = 0;
        StringBuffer result = new StringBuffer();
    
        while ((e = str.indexOf(pattern, s)) >= 0) {
            result.append(str.substring(s, e));
            result.append(replace);
            s = e+pattern.length();
        }
        result.append(str.substring(s));
        return result.toString();
    }

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FFGen gui = new FFGen();
		gui.First();
		gui.repaint();
	}

}

I still have a lot of coding to do because of the several condition combinations i have to make for each flip flop type.

I hope you guys can help me..