Professional Documents
Culture Documents
Adrineel Saha - C-191 - Formal Language and Automata Theory (PCCCS502) - Mini Project
Adrineel Saha - C-191 - Formal Language and Automata Theory (PCCCS502) - Mini Project
Adrineel Saha - C-191 - Formal Language and Automata Theory (PCCCS502) - Mini Project
Given a regular expression, write down a program which shows the step by
step labeled graph of corresponding finite automaton. Moreover, perform this
task preferably using Java language in order to construct a graphical tool for
visualisation of the above process.
Folder Tree:-
BinaryTree.java:-
package Core.BinaryTree;
/**
*/
*/
setRoot(root);
/**
*/
public BinaryTree() {
/**
*/
return root;
/**
*/
this.root = root;
this.root.setParent(null);
BinaryTreeNode.java:-
package Core.BinaryTree;
/**
*/
/**
*/
setValue(value);
}
/**
*/
public BinaryTreeNode() {
/**
*/
return parent;
/**
*/
this.parent = parent;
/**
*
*/
return value;
/**
*/
this.value = value;
/**
*/
return leftChild;
/**
*/
this.leftChild = leftChild;
this.leftChild.setParent(this);
}
/**
*/
return rightChild;
/**
*/
this.rightChild = rightChild;
this.rightChild.setParent(this);
DFA.java:-
package Core.DFA;
import Core.FA;
/**
*
* @author Adrineel Saha
*/
/**
*/
super(alphabets);
DFABuilder.java:-
package Core.DFA;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;
import Core.NFA.NFA;
import Core.Transition.LetterTransition;
import Core.Transition.Transition;
/**
*/
public class DFABuilder {
/**
*/
this.nfa = nfa;
this.alphabets = nfa.getAlphabets();
/**
*/
this.dfa = dfa;
this.alphabets = dfa.getAlphabets();
/**
*/
public NFA getNFA() {
return nfa;
/**
*/
return alphabets;
/**
*/
try{
decreaseTable = calculateDecreaseTable();
oldStates.addAll(dfa.getStates());
if (decreaseTable[i][j] == 0) {
unifyStates(oldStates.get(i), oldStates.get(j));
}
}
Collections.sort(dfa.getStates());
// dfa.optimizeStatesName();
}catch(NullPointerException E){}
return dfa;
/**
*/
if (!dfa.getAcceptingStates().contains(states.get(j))) {
decreaseTable[rowOrColumn][j] = 1;
if (!dfa.getAcceptingStates().contains(states.get(j))) {
decreaseTable[j][rowOrColumn] = 1;
}
}
new
boolean[decreaseTable.length][decreaseTable.length]);
return decreaseTable;
/**
*/
try{
if (i < j) {
int temp = i;
i = j;
j = temp;
if (rel != 0)
return rel;
if (inProgress[i][j])
return 0;
inProgress[i][j] = true;
if (dfa.getTransitions().get(k).getFrom().equals(state1)) {
state1To.put(dfa.getTransitions().get(k).getLetter(),
dfa.getTransitions().get(k)
.getTo());
if (dfa.getTransitions().get(k).getFrom().equals(state2)) {
state2To.put(dfa.getTransitions().get(k).getLetter(),
dfa.getTransitions().get(k)
.getTo());
if
(state1To.get(getAlphabets()[k]).equals(state2To.get(getAlphabets()[k]))) {
continue;
} else if (state1.equals(state1To.get(getAlphabets()[k]))
&& state2.equals(state2To.get(getAlphabets()[k]))) {
continue;
} else {
dfa.getStates().indexOf(state1To.get(getAlphabets()[k])), dfa.getStates()
if (relation != 0) {
inProgress[i][j] = false;
return relation + 1;
}
inProgress[i][j] = false;
}catch(NullPointerException E){}
return 0;
/**
*/
if (!dfa.getStates().contains(state1)) {
if (embededStates[j].equals(state1)) {
state1 = dfa.getStates().get(i);
break outerFor;
if (!dfa.getStates().contains(state2)) {
if (embededStates[j].equals(state2)) {
state2 = dfa.getStates().get(i);
break outerFor;
dfa.getStates().remove(state1);
dfa.getStates().remove(state2);
if (dfa.getStartingState().equals(state1) || dfa.getStartingState().equals(state2)) {
if (dfa.getAcceptingStates().contains(state1) ||
dfa.getAcceptingStates().contains(state2)) {
dfa.getAcceptingStates().remove(state1);
dfa.getAcceptingStates().remove(state2);
if (dfa.getTransitions().get(i).getFrom().equals(state1)
|| dfa.getTransitions().get(i).getFrom().equals(state2)) {
if (dfa.getTransitions().get(i).getTo().equals(state1)
|| dfa.getTransitions().get(i).getTo().equals(state2)) {
shallowCopy.addAll(dfa.getTransitions());
while (dfa.getTransitions().contains(shallowCopy.get(i))) {
dfa.getTransitions().remove(shallowCopy.get(i));
dfa.addTransition(shallowCopy.get(i));
/**
*/
dfa.addState(nfa.getStartingState());
dfa.setStartingState(nfa.getStartingState());
dfa.addTransition(new LetterTransition(getAlphabets()[i],
dfa.getStartingState(),
getUniqueNameFromList(deltaStar(dfa.getStartingState(),
getAlphabets()[i]))));
buildTransitionsRecursively(dfa);
if (!dfa.getStates().contains(dfa.getTransitions().get(i).getFrom()))
dfa.addState(dfa.getTransitions().get(i).getFrom());
if (!dfa.getStates().contains(dfa.getTransitions().get(i).getTo()))
dfa.addState(dfa.getTransitions().get(i).getTo());
if (!dfa.getStates().get(i).equals("null")) {
if (dfa.getStates().get(i).indexOf(',') > 0) {
if
(nfa.getAcceptingStates().contains(dfa.getStates().get(i).split(",")[j])) {
dfa.addAcceptingState(dfa.getStates().get(i));
break;
} else {
if (nfa.getAcceptingStates().contains(dfa.getStates().get(i)))
dfa.addAcceptingState(dfa.getStates().get(i));
if (acceptsLambda(nfa.getStartingState())) {
if (!dfa.getAcceptingStates().contains(nfa.getStartingState()))
dfa.addAcceptingState(nfa.getStartingState());
dfa.optimizeStatesName();
return dfa;
/**
*
* @author Adrineel Saha
*/
newTransitions.addAll(dfa.getTransitions());
if (dfa.getTransitions().get(i).getTo()
.equals(dfa.getTransitions().get(j).getFrom())) {
alphasInTransitions.put(dfa.getTransitions().get(j).getLetter(), true);
ArrayList<Character> notIncludedLetters =
getNotIncludedLetters(alphasInTransitions
.keySet());
.getTransitions().get(i).getTo(),
getUniqueNameFromList(deltaStar(dfa
.getTransitions().get(i).getTo(),
notIncludedLetters.get(j))));
if (!newTransitions.contains(trans))
newTransitions.add(trans);
if (!dfa.getTransitions().equals(newTransitions)) {
dfa.setTransitions(newTransitions);
buildTransitionsRecursively(dfa);
/**
*/
if (nfa.getTransitions().get(i).getFrom().equals(state)
&& nfa.getTransitions().get(i).isLambda()) {
if
(nfa.getAcceptingStates().contains(nfa.getTransitions().get(i).getTo())) {
return true;
} else {
if (acceptsLambda(nfa.getTransitions().get(i).getTo())) {
return true;
return false;
/**
*
*/
if (!list.contains(getAlphabets()[i]))
result.add(getAlphabets()[i]);
return result;
/**
*/
if (result.equals(""))
result = "null";
return result;
/**
*/
if (state.indexOf(',') > 0)
departureClosure.addAll(lambdaClosure(state.split(",")[i]));
else
departureClosure = lambdaClosure(state);
if
(nfa.getTransitions().get(j).getFrom().equals(departureClosure.get(i))
&& !nfa.getTransitions().get(j).isLambda()
ArrayList<String> states =
lambdaClosure(nfa.getTransitions().get(j).getTo());
if (!resultStates.containsAll(states))
resultStates.addAll(states);
return resultStates;
/**
*/
if (nfa.getTransitions().get(i).getFrom().equals(state)
&& nfa.getTransitions().get(i).isLambda()) {
resultStates.addAll(lambdaClosure(nfa.getTransitions().get(i).getTo()));
return resultStates;
NFA.java:-
package Core.NFA;
import Core.FA;
/**
*/
/**
*/
super(alphabets);
}
NFABuilder.java:-
package Core.NFA;
import java.util.ArrayList;
import java.util.Date;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import Core.BinaryTree.BinaryTree;
import Core.BinaryTree.BinaryTreeNode;
import Core.Transition.LambdaTransition;
import Core.Transition.LetterTransition;
import Core.Transition.Transition;
/**
*/
/**
*/
setAlphabets(alphabets);
setRegularExpression(regularText);
/**
*/
return regularExpression;
/**
*/
this.regularExpression = regularExpression;
}
/**
*/
return alphabets;
/**
*/
this.alphabets = alphabets;
/**
*/
return false;
}
if (temp.equals(""))
return true;
return false;
/**
*/
try {
Pattern.compile(getRegularExpression());
} catch (PatternSyntaxException e) {
if (!isRegex()) {
/**
*
* @author Adrineel Saha
*/
kleenePositions.add(i);
if (temp.charAt(position) == ')')
counter++;
counter--;
if (counter == 0)
break firstLoop;
position--;
position += i * 2;
fixedKleeneStartPriorityRegex = fixedKleeneStartPriorityRegex.substring(0,
position)
+ "(" + fixedKleeneStartPriorityRegex.substring(position,
endPos) + ")"
+ fixedKleeneStartPriorityRegex.substring(endPos);
concatPositions.add(i);
concatPositions.add(i);
if (fixedKleeneStartPriorityRegex.charAt(position) == ')')
counter++;
counter--;
if (counter == 0)
break firstLoop;
position--;
position += i * 2;
+ fixedConcatPriorityRegex.substring(position);
counter = 0;
position = concatPositions.get(i)
+
(fixedKleeneStartPriorityRegex.charAt(concatPositions.get(i) + 1) == '*' ? 2
: 1);
if (fixedKleeneStartPriorityRegex.charAt(position) == '(')
counter++;
counter--;
if (counter == 0)
break secondLoop;
position++;
position += i * 2 + 1;
+ fixedConcatPriorityRegex.substring(position);
return fixedConcatPriorityRegex;
/**
*/
checkRegexValidity();
getEnhancedRegex(getRegularExpression())));
buildRegexTree(tree.getRoot());
nfa.optimizeStatesName();
return nfa;
/**
*/
if (expression.charAt(position) == '(')
counter++;
counter--;
position++;
if (counter == 0) {
break matchFinder;
node.setValue(expression.substring(1, expression.length()
- 1));
buildRegexTree(node);
return;
} else {
leftChildNode.setValue(expression.substring(1,
expression.length() - 2));
node.setValue(KLEENE_START_IDENTIFIER);
node.setLeftChild(leftChildNode);
buildRegexTree(leftChildNode);
return;
} else {
if (expression.charAt(position) == '*') {
position++;
leftChildNode.setValue(KLEENE_START_IDENTIFIER);
leftChildNode.setLeftChild(leftleftChildNode);
node.setLeftChild(leftChildNode);
buildRegexTree(leftleftChildNode);
: CONCAT_IDENTIFIER;
if (nodeValue.equals(UNION_IDENTIFIER))
position++;
node.setValue(nodeValue);
if (node.getLeftChild() == null) {
leftChildNode.setValue(expression.substring(1,
position -
(nodeValue.equals(CONCAT_IDENTIFIER) ? 1 : 2)));
node.setLeftChild(leftChildNode);
buildRegexTree(leftChildNode);
rightChildNode.setValue(expression.substring(position));
node.setRightChild(rightChildNode);
buildRegexTree(rightChildNode);
return;
} else if (expression.length() == 1) {
return;
// System.out.println(value);
// ")");
// }
// while (true) {
// if (newText.equals(text))
// break;
// text = newText;
// }
// System.out.println(text);
// node.setValue(text);
// buildRegexTree(node);
// }
/**
*/
return buildNFAFromNode(tree.getRoot());
/**
*/
// node.setRightChild(null);
// node.setLeftChild(null);
// }
if (isInAlphabets(value))
return createSimpleNFA(value.charAt(0));
if (value.equals(CONCAT_IDENTIFIER) ||
value.equals(UNION_IDENTIFIER)) {
if (node.getLeftChild() == null ||
node.getLeftChild().getValue() == null
|| node.getRightChild() == null
|| node.getRightChild().getValue() == null)
if (value.equals(CONCAT_IDENTIFIER))
else if (value.equals(UNION_IDENTIFIER))
} else if (value.equals(KLEENE_START_IDENTIFIER)) {
if (node.getLeftChild() == null ||
node.getLeftChild().getValue() == null)
return kleeneStarNFA(leftNFA);
// return null;
/**
*/
private boolean isInAlphabets(String text) {
try {
if (text.equals(getAlphabets()[i] + ""))
return true;
} catch (Exception e) {
return false;
/**
*/
states.add(state1);
states.add(state2);
acceptingStates.add(state2);
transitions.add(new LetterTransition(acceptingChar, state1, state2));
nfa.setStates(states);
nfa.setAcceptingStates(acceptingStates);
nfa.setStartingState(startingState);
nfa.setTransitions(transitions);
return nfa;
/**
*/
if (nfa1 == null)
return nfa2;
if (nfa2 == null)
return nfa1;
nfa.addState(newState);
nfa.addStates(nfa1.getStates());
nfa.addStates(nfa2.getStates());
nfa.setStartingState(newState);
nfa.addAcceptingStates(nfa1.getAcceptingStates());
nfa.addAcceptingStates(nfa2.getAcceptingStates());
nfa.addTransition(new LambdaTransition(newState, nfa1.getStartingState()));
nfa.addTransitions(nfa1.getTransitions());
nfa.addTransitions(nfa2.getTransitions());
return nfa;
/**
*/
if (nfa1 == null)
return nfa2;
if (nfa2 == null)
return nfa1;
nfa.addStates(nfa1.getStates());
nfa.addStates(nfa2.getStates());
nfa.setStartingState(nfa1.getStartingState());
nfa.addAcceptingStates(nfa2.getAcceptingStates());
nfa.addTransition(new LambdaTransition(nfa1.getAcceptingStates().get(i),
nfa2
.getStartingState()));
}
nfa.addTransitions(nfa1.getTransitions());
nfa.addTransitions(nfa2.getTransitions());
return nfa;
/**
*/
nfa.addState(newState);
nfa.addStates(givenNfa.getStates());
nfa.setStartingState(newState);
nfa.addAcceptingState(newState);
nfa.addTransition(new
LambdaTransition(givenNfa.getAcceptingStates().get(i), newState));
nfa.addTransitions(givenNfa.getTransitions());
return nfa;
}
/**
*/
uniqueNumber += uniqueCounter;
uniqueCounter++;
return uniqueNumber;
// System.out.println(text);
// }
// if (node != null) {
// printAllChildren(node.getLeftChild());
// printAllChildren(node.getRightChild());
// }
// }
/**
*/
/**
*/
super(string);
/**
*/
public NotRegularStringException() {
super();
LambdaTransition.java:-
package Core.Transition;
/**
*/
super();
this.from = from;
this.to = to;
@Override
return true;
@Override
return 'Λ';
@Override
return from;
@Override
return to;
}
@Override
@Override
this.from = from;
@Override
this.to = to;
@Override
return false;
try {
if (((Transition) obj).getFrom().equals(getFrom())
return true;
} catch (Exception e) {
return false;
@Override
LetterTransition.java:-
package Core.Transition;
/**
*/
super();
this.letter = letter;
this.from = from;
this.to = to;
@Override
return false;
@Override
public char getLetter() {
return letter;
@Override
return from;
@Override
return to;
@Override
this.letter = letter;
@Override
this.from = from;
@Override
this.to = to;
@Override
return false;
try {
if (((Transition) obj).getFrom().equals(getFrom())
return true;
} catch (Exception e) {
return false;
@Override
return "From: " + getFrom() + " to " + getTo() + " with " + getLetter();
Transition.java:-
package Core.Transition;
/**
*/
/**
*/
/**
*/
/**
*/
/**
*/
/**
*/
*/
/**
*/
FA.java:-
package Core;
import java.util.ArrayList;
import Core.Transition.Transition;
/**
*/
public class FA {
private char[] alphabets;
/**
*/
this.alphabets = alphabets;
/**
*/
return alphabets;
/**
*
*/
return states;
/**
*/
this.states = states;
/**
*/
this.states.add(state);
/**
*/
states.addAll(list);
}
/**
*/
return acceptingStates;
/**
*/
this.acceptingStates = acceptingStates;
/**
*/
this.acceptingStates.addAll(list);
/**
this.acceptingStates.add(state);
/**
*/
return startingState;
/**
*/
this.startingState = startingState;
/**
*/
return transitions;
}
/**
*/
this.transitions = transitions;
this.transitions.addAll(list);
/**
*/
this.transitions.add(item);
/**
*/
newnewStates.add(newStateName);
if (acceptingStates.get(j).equals(oldStateName)) {
newAcceptingStates.add(newStateName);
} else {
newAcceptingStates.add(acceptingStates.get(j));
setAcceptingStates(newAcceptingStates);
if (transitions.get(j).getFrom().equals(oldStateName))
transitions.get(j).setFrom(newStateName);
if (transitions.get(j).getTo().equals(oldStateName))
transitions.get(j).setTo(newStateName);
if (startingState.equals(oldStateName))
startingState = newStateName;
setStates(newnewStates);
/**
*/
@Override
builder.append("States:\n");
builder.append("\n---------------------\n");
builder.append("Starting State:\n");
builder.append(getStartingState());
builder.append("\n---------------------");
builder.append("\nAccepting States:\n");
builder.append("\n---------------------");
builder.append("\nTransitions:");
builder.append("\n" + getTransitions().get(i).toString());
return builder.toString();
FAFrame.java:-
package GUI;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import Core.FA;
import Core.DFA.DFABuilder;
import Core.NFA.NFA;
import Core.NFA.NFABuilder;
/**
* This class is the main frame of the application. You just need to initialize
*
*
*/
public FAFrame() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
| UnsupportedLookAndFeelException e) {
e.printStackTrace();
pack();
setExtendedState(JFrame.MAXIMIZED_BOTH);
setDefaultCloseOperation(EXIT_ON_CLOSE);
init();
setVisible(true);
/**
*/
.getHeight()));
.getHeight()));
faTypePan.setBorder(BorderFactory.createTitledBorder("FA Type"));
nfaButton.setSelected(true);
// minidfaButton.setEnabled(false);
gp.add(nfaButton);
gp.add(dfaButton);
gp.add(minidfaButton);
// plotButton.setEnabled(false);
rightPane.setBorder(BorderFactory.createTitledBorder("Finite Automaton"));
regPan.setLayout(new VerticalFlowLayout());
regPan.add(enterAlphas);
regPan.add(alphaText);
regPan.add(enterRegex);
regPan.add(regexText);
faTypePan.setLayout(new VerticalFlowLayout());
faTypePan.add(chooseFAType);
faTypePan.add(nfaButton);
faTypePan.add(dfaButton);
faTypePan.add(minidfaButton);
leftPane.setLayout(new VerticalFlowLayout());
leftPane.add(regPan);
leftPane.add(faTypePan);
leftPane.add(plotButton);
rightPane.setLayout(new FlowLayout());
rightPane.add(faPanel);
getContentPane().setLayout(new SpringLayout());
getContentPane().add(leftPane);
getContentPane().add(rightPane);
regexText.getDocument().addDocumentListener(new DocumentListener() {
@Override
if (regexText.getText().trim().equals("") ||
alphaText.getText().trim().equals("")) {
plotButton.setEnabled(false);
} else
plotButton.setEnabled(true);
}
@Override
if (regexText.getText().trim().equals("")) {
plotButton.setEnabled(false);
} else
plotButton.setEnabled(true);
@Override
});
alphaText.getDocument().addDocumentListener(new DocumentListener() {
@Override
if (regexText.getText().trim().equals("") ||
alphaText.getText().trim().equals("")) {
plotButton.setEnabled(false);
} else
plotButton.setEnabled(true);
@Override
if (regexText.getText().trim().equals("")) {
plotButton.setEnabled(false);
} else
plotButton.setEnabled(true);
}
@Override
});
getContentPane().addComponentListener(new ComponentListener() {
@Override
@Override
rightPane.setSize(getContentPane().getWidth() -
leftPane.getWidth() - 15,
getContentPane().getHeight() - 15);
rightPane.setPreferredSize(new
Dimension(getContentPane().getWidth()
- leftPane.getWidth() - 15,
getContentPane().getHeight() - 15));
rightPane.setLocation(leftPane.getWidth() + 5,
getContentPane().getY() + 5);
faPanel.setPreferredSize(new Dimension(rightPane.getWidth() -
40, rightPane
.getHeight() - 50));
faPanel.setLocation(20, 30);
}
@Override
@Override
});
plotButton.addActionListener(new ActionListener() {
@Override
try {
realAlhpas[i] = alphas[i].trim().charAt(0);
FA fa = null;
fa = nfaBuilder.toNFA();
if (dfaButton.isSelected()) {
fa = dfaBuilder.getDFAfromNFA();
if (minidfaButton.isSelected()) {
fa = minBuilder.getMinimizedDFAfromDFA();
faPanel.setFA(fa);
} catch (NullPointerException E) {}
});
FAPanel.java:-
package GUI;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.geom.QuadCurve2D;
import java.util.ArrayList;
import javax.swing.JComponent;
import Core.FA;
import Core.Transition.Transition;
/**
* area.
*/
public FAPanel() {
super();
addComponentListener(new ComponentListener() {
@Override
}
@Override
reorderComponents();
repaint();
@Override
@Override
});
/**
*/
states = null;
startingState = null;
transitions = null;
removeAll();
fa.getStates().get(i)), STATES_DIAMETER);
if (fa.getStartingState().equals(fa.getStates().get(i))) {
startingState = states[i];
add(states[i]);
transitions.addAll(fa.getTransitions());
reorderComponents();
repaint();
/**
*/
try {
/ (STATES_DIAMETER + STATES_GAP);
: horizontalCount;
- STATES_GAP;
int wholeStatesHeight = noOfStateRows * (STATES_GAP +
STATES_DIAMETER)
- STATES_GAP;
+ ((getWidth() / 2) - (wholeStatesWidth /
2));
+ ((getHeight() / 2) - (wholeStatesHeight /
2));
states[i].setLocation(x, y);
} catch (Exception e) {
validate();
repaint();
/**
*/
/**
*
*/
if (states[i].getName().equals(stateName))
return states[i];
return null;
/**
*/
@Override
super.paint(g);
if (states == null)
return;
g.setColor(Color.black);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
RenderingHints.VALUE_ANTIALIAS_ON);
qualityHints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHints(qualityHints);
StateView s1 = getStateView(transitions.get(i).getFrom());
StateView s2 = getStateView(transitions.get(i).getTo());
int xCurve = 0;
int yCurve = 0;
arrow1X = toX;
arrow2Y = toY;
arrow1X = toX;
arrow2Y = toY;
yCurve = curveValue;
arrow1X = toX;
arrow2Y = toY;
xCurve = -curveValue;
arrow1X = toX;
arrow1Y = toY + arrowLength;
arrow2Y = toY;
yCurve = 60;
arrow2X = toX;
xCurve = curveValue;
arrow1X = toX;
arrow2Y = toY;
arrow1X = toX;
arrow2Y = toY;
yCurve = -curveValue;
arrow1X = toX;
arrow2Y = toY;
arrow1X = toX;
arrow2Y = toY;
}
}
if
(transitions.get(i).getFrom().equals(transitions.get(j).getFrom())
&&
transitions.get(i).getTo().equals(transitions.get(j).getTo())
&& transitions.get(i).getLetter() !=
transitions.get(j).getLetter()) {
if (j < i)
continue mainFor;
g2.draw(curve);
startingState.getX(), startingState.getY() +
(STATES_DIAMETER / 2));
g2.drawLine(startingState.getX(), startingState.getY() +
(STATES_DIAMETER / 2),
g2.drawLine(startingState.getX(), startingState.getY() +
(STATES_DIAMETER / 2),
Main.java:-
package GUI;
/**
*/
*/
new FAFrame();
StateView.java:-
package GUI;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JComponent;
/**
*/
*/
super();
this.name = name;
/**
*/
this(name);
this.isAccepting = isAccepting;
/**
*/
this(name, isAccepting);
setDiameter(diameter);
}
/**
*/
return diameter;
/**
*/
this.diameter = diameter;
setSize(getPreferredSize());
/**
*/
return name;
/**
*
* @author Adrineel Saha
*/
this.name = name;
/**
*/
return isAccepting;
/**
*/
this.isAccepting = isAccepting;
/**
*/
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
RenderingHints.VALUE_ANTIALIAS_ON);
qualityHints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHints(qualityHints);
g2.setFont(font);
g2.drawString(
name,
if (isAccepting)
VerticalFlowLayout.java:-
package GUI;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;
/**
* <ul>
* <li><code>ComponentOrientation.TOP_TO_BOTTOM</code>
* <li><code>ComponentOrientation.BOTTOM_TO_TOP</code>
* </ul>
* buttons horizontally until no more buttons fit on the same line. The line
* values are:
* <ul>
* </ul>
* <p>
*/
/**
*/
* left-justified.
*/
/**
*/
/**
* right-justified.
*/
/**
* <ul>
* </ul>
* @see #getAlignment
* @see #setAlignment
*/
/**
* The flow layout manager allows a seperation of components with gaps. The
* horizontal gap will specify the space between components and between the
* @see #getHgap()
* @see #setHgap(int)
*/
int hgap;
/**
* The flow layout manager allows a seperation of components with gaps. The
* vertical gap will specify the space between rows and between the the rows
* @see #getHgap()
* @see #setHgap(int)
*/
int vgap;
/**
*/
public VerticalFlowLayout() {
this(CENTER, 5, 5);
/**
* alignment and a default 5-unit horizontal and vertical gap. The value of
* <code>VerticalFlowLayout.CENTER</code>
* @param align
*/
this(align, 5, 5);
/**
* Creates a new flow layout manager with the indicated alignment and the
* <p>
* <code>VerticalFlowLayout.TOP</code>,
* <code>VerticalFlowLayout.BOTTOM</code>, or
* <code>VerticalFlowLayout.CENTER</code>.
* @param align
* @param hgap
* @param vgap
*/
this.hgap = hgap;
this.vgap = vgap;
setAlignment(align);
/**
* <code>VerticalFlowLayout.TOP</code>,
* <code>VerticalFlowLayout.BOTTOM</code> or
* <code>VerticalFlowLayout.CENTER</code>,
* @see java.awt.VerticalFlowLayout#setAlignment
* @since JDK1.1
*/
return align;
/**
* <ul>
* <li><code>VerticalFlowLayout.TOP</code>
* <li><code>VerticalFlowLayout.BOTTOM</code>
* <li><code>VerticalFlowLayout.CENTER</code>
* </ul>
* @param align
* @see #getAlignment()
* @since JDK1.1
*/
/**
* Gets the horizontal gap between components and between the components and
* @return the horizontal gap between components and between the components
* @see java.awt.VerticalFlowLayout#setHgap
* @since JDK1.1
*/
return hgap;
/**
* Sets the horizontal gap between components and between the components and
* @param hgap
* @see java.awt.VerticalFlowLayout#getHgap
* @since JDK1.1
*/
this.hgap = hgap;
/**
* Gets the vertical gap between components and between the components and
* @return the vertical gap between components and between the components
* @see java.awt.VerticalFlowLayout#setVgap
* @since JDK1.1
*/
return vgap;
/**
* Sets the vertical gap between components and between the components and
* @param vgap
* @see java.awt.VerticalFlowLayout#getVgap
*/
this.vgap = vgap;
/**
* Adds the specified component to the layout. Not used by this class.
* @param name
* @param comp
* the component to be added
*/
/**
* Removes the specified component from the layout. Not used by this class.
* @param comp
* @see java.awt.Container#removeAll
*/
/**
* Returns the preferred dimensions for this layout given the <i>visible</i>
* @param target
* specified container
* @see Container
* @see #minimumLayoutSize
* @see java.awt.Container#getPreferredSize
*/
synchronized (target.getTreeLock()) {
Component m = target.getComponent(i);
if (m.isVisible()) {
Dimension d = m.getPreferredSize();
if (firstVisibleComponent) {
firstVisibleComponent = false;
} else {
dim.height += vgap;
dim.height += d.height;
return dim;
/**
* @param target
* the container that needs to be laid out
* specified container
* @see #preferredLayoutSize
* @see java.awt.Container
* @see java.awt.Container#doLayout
*/
synchronized (target.getTreeLock()) {
Component m = target.getComponent(i);
if (m.isVisible()) {
Dimension d = m.getMinimumSize();
if (firstVisibleComponent) {
firstVisibleComponent = false;
} else {
dim.height += vgap;
dim.height += d.height;
return dim;
/**
* Lays out the container. This method lets each <i>visible</i> component
* <code>VerticalFlowLayout</code> object.
* @param target
* @see Container
* @see java.awt.Container#doLayout
*/
synchronized (target.getTreeLock()) {
int y = 0;
int columnWidth = 0;
int start = 0;
Component m = target.getComponent(i);
if (m.isVisible()) {
Dimension d = m.getPreferredSize();
m.setSize(d.width, d.height);
if (y > 0) {
y += vgap;
y += d.height;
} else {
start, i, ttb);
y = d.height;
x += hgap + columnWidth;
columnWidth = d.width;
start = i;
nmembers, ttb);
/**
* @param target
* @param x
* the x coordinate
* @param y
* the y coordinate
* @param width
* @param height
* @param columnStart
* @param columnEnd
*/
private void moveComponents(Container target, int x, int y, int width, int height,
switch (align) {
case TOP:
y += ttb ? 0 : height;
break;
case CENTER:
y += height / 2;
break;
case BOTTOM:
y += ttb ? height : 0;
break;
if (m.isVisible()) {
int cx;
cx = x + (width - m.getSize().width) / 2;
if (ttb) {
m.setLocation(cx, y);
} else {
m.setLocation(cx, target.getSize().height - y -
m.getSize().height);
y += m.getSize().height + vgap;
/**
*/
switch (align) {
case TOP:
str = ",align=top";
break;
case CENTER:
str = ",align=center";
break;
case BOTTOM:
str = ",align=bottom";
break;
Output:-