In_June

NFA

Nov 23rd, 2014
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.62 KB | None | 0 0
  1. import java.util.ArrayList;
  2.  
  3. /**
  4.  * Created by Steven on 23/11/2014.
  5.  */
  6. public class NFA {
  7.     private State currentState;
  8.  
  9.     public NFA(State... states) {
  10.         this.currentState = states[0]; // Always put start state as first state.
  11.     }
  12.  
  13.     public boolean recognises(String s) {
  14.         return recognises(currentState, s, 0);
  15.     }
  16.  
  17.     private boolean recognises(State state, String s, int offset) {
  18.         if (offset >= s.length()) {
  19.             return state.isFinalState();
  20.         }
  21.         ArrayList<State> nextStates = state.getTransitions(s.charAt(offset));
  22.         for (State next : nextStates)
  23.             if(recognises(next, s, offset+1))
  24.                 return true;
  25.  
  26.         return false;
  27.     }
  28.  
  29.     public static void main(String[] args) {
  30.         State startState = new State(false);
  31.         State tState = new State(false);
  32.         State uState = new State(false);
  33.         State vState = new State(true);
  34.  
  35.         startState.addTransition('A', tState);
  36. //        tState.addTransition('B', vState);
  37. //        tState.addTransition('B', uState);
  38.         tState.addTransition('A', vState);
  39.         tState.addTransition('A', uState);
  40.         tState.addTransition('A', uState);
  41.         uState.addTransition('A', vState);
  42.         vState.addTransition('A', startState);
  43.  
  44.         NFA nfa = new NFA(startState, tState, uState, vState);
  45.         for(int i = 1; i < 1000; i++) {
  46.             String repeated = new String(new char[i]).replace("\0", "A");
  47.             System.out.println(repeated+":: "+ nfa.recognises(repeated));
  48.         }
  49.     }
  50. }
  51.  
  52. import java.util.ArrayList;
  53. import java.util.HashMap;
  54.  
  55. /**
  56.  * Handles states.
  57.  * Created by Steven on 23/11/2014.
  58.  */
  59. public class State {
  60.     private HashMap<Character, ArrayList<State>> transitions;
  61.     private boolean finalState;
  62.  
  63.     public State(boolean isFinal) {
  64.         transitions = new HashMap<Character, ArrayList<State>>();
  65.         this.finalState = isFinal;
  66.     }
  67.     public void addTransition(char c, State s) {
  68.         ArrayList<State> states = transitions.get(c);
  69.         if(states == null) {
  70.             states = new ArrayList<State>();
  71.         }
  72.         states.add(s);
  73.         transitions.put(c, states);
  74.     }
  75.  
  76.     public ArrayList<State> getTransitions(char c) {
  77.         if(isValidTransition(c)) {
  78.             return transitions.get(c);
  79.         }
  80.         return new ArrayList<State>(); // return empty list so we can ignore null pointers.
  81.     }
  82.  
  83.     private boolean isValidTransition(char c) {
  84.         return transitions.get(c) != null;
  85.     }
  86.  
  87.     public boolean isFinalState() {
  88.         return finalState;
  89.     }
  90. }
Add Comment
Please, Sign In to add comment