1 31 32 package org.antlr.works.visualization.fa; 33 34 import org.antlr.analysis.NFAState; 35 import org.antlr.analysis.Transition; 36 37 import java.util.*; 38 39 43 44 public class FAAnalysis { 45 46 private Set processedStates = new HashSet(); 47 private Map stateIncomingTransitionCount = new HashMap(); 48 49 public FAAnalysis() { 50 } 51 52 public void reset() { 53 processedStates.clear(); 54 stateIncomingTransitionCount.clear(); 55 } 56 57 60 61 public void analyze(FAState state) { 62 reset(); 63 recursiveAnalysis(state); 64 } 65 66 69 70 public void analyze(NFAState state) { 71 reset(); 72 recursiveAnalysis(state); 73 } 74 75 public void recursiveAnalysis(NFAState state) { 76 if(processedStates.contains(state)) 77 return; 78 processedStates.add(state); 79 80 for(int t=0; t<state.getNumberOfTransitions(); t++) { 81 Transition transition = state.transition(t); 82 addIncomingTransitionToState((NFAState)transition.target); 83 recursiveAnalysis((NFAState)transition.target); 84 } 85 } 86 87 public void recursiveAnalysis(FAState state) { 88 if(processedStates.contains(state)) 89 return; 90 processedStates.add(state); 91 92 for(int t=0; t<state.getNumberOfTransitions(); t++) { 93 FATransition transition = state.transition(t); 94 addIncomingTransitionToState(transition.target); 95 recursiveAnalysis(transition.target); 96 } 97 } 98 99 public void addIncomingTransitionToState(Object state) { 100 Integer i = (Integer )stateIncomingTransitionCount.get(state); 101 int count = 0; 102 if(i != null) 103 count = i.intValue(); 104 stateIncomingTransitionCount.put(state, new Integer (count+1)); 105 } 106 107 public int numberOfIncomingTransition(Object state) { 108 Integer i = (Integer )stateIncomingTransitionCount.get(state); 109 if(i == null) 110 return 0; 111 else 112 return i.intValue(); 113 } 114 115 public String toString() { 116 StringBuffer s = new StringBuffer (); 117 Iterator iterator = stateIncomingTransitionCount.keySet().iterator(); 118 while(iterator.hasNext()) { 119 NFAState key = (NFAState)iterator.next(); 120 Integer count = (Integer )stateIncomingTransitionCount.get(key); 121 s.append(key.stateNumber+" = "+count.intValue()+"\n"); 122 } 123 return s.toString(); 124 } 125 } 126 | Popular Tags |