1 31 32 package org.antlr.works.visualization.fa; 33 34 import org.antlr.analysis.NFAState; 35 36 import java.util.*; 37 38 41 42 public class FAState { 43 44 public int stateNumber = -1; 45 public boolean acceptedState = false; 46 public String enclosingRuleName = null; 47 public List<FATransition> transitions = new ArrayList<FATransition>(); 48 49 51 public String externalRuleRefName = null; 52 53 55 public Set skippedStates = new HashSet(); 56 57 58 public boolean loop = false; 59 60 public FAState(int stateNumber) { 61 this.stateNumber = stateNumber; 62 } 63 64 public FAState(NFAState state) { 65 this.stateNumber = state.stateNumber; 66 this.acceptedState = state.isAcceptState(); 67 this.enclosingRuleName = state.getEnclosingRule(); 68 } 69 70 public FAState(String externalRuleRefName) { 71 this.externalRuleRefName = externalRuleRefName; 72 } 73 74 public void addTransition(FATransition transition) { 75 transition.setSourceState(this); 76 transitions.add(transition); 77 sortTransitions(); 78 } 79 80 public void addTransition(FATransition transition, boolean loop) { 81 transition.setSourceState(this); 82 transition.setLoop(loop); 83 transitions.add(transition); 84 sortTransitions(); 85 } 86 87 private void sortTransitions() { 88 if(transitions.size()<=1) 89 return; 90 91 94 for(int t=0; t<transitions.size(); t++) { 95 FATransition transition = transitions.get(t); 96 if(transition.loop && t<transitions.size()-1) { 97 Collections.swap(transitions, t, transitions.size()-1); 99 break; 100 } 101 } 102 } 103 104 public FATransition getFirstTransition() { 105 if(transitions.isEmpty()) 106 return null; 107 else 108 return transitions.get(0); 109 } 110 111 public FATransition transition(int index) { 112 return transitions.get(index); 113 } 114 115 public int getNumberOfTransitions(){ 116 return transitions.size(); 117 } 118 119 public FAState getNextFirstState() { 120 return getFirstTransition().target; 121 } 122 123 public FATransition getTransitionToStateNumber(int stateNumber) { 124 for (FATransition transition : transitions) { 125 if (transition.target.stateNumber == stateNumber) 126 return transition; 127 } 128 return null; 129 } 130 131 134 135 public FATransition getTransitionToExternalStateRule(String externalRule) { 136 for (FATransition tr : transitions) { 137 if (tr.target == null) 138 continue; 139 140 for (FATransition targetTr : tr.target.transitions) { 143 if (targetTr.label != null && targetTr.label.equals(externalRule)) 144 return tr; 145 } 146 } 147 return null; 148 } 149 150 153 154 public boolean isAlternative() { 155 return getNumberOfTransitions() > 1; 156 } 157 158 161 162 public boolean isSingle() { 163 return getNumberOfTransitions() == 1; 164 } 165 166 public int hashCode() { 167 return stateNumber; 168 } 169 170 public boolean equals(Object o) { 171 if(o instanceof FAState) { 172 FAState otherState = (FAState)o; 173 return stateNumber == otherState.stateNumber; 174 } else { 175 return false; 176 } 177 } 178 179 public String toString() { 180 if(externalRuleRefName == null) 181 return String.valueOf(stateNumber); 182 else 183 return "<"+externalRuleRefName+">"; 184 } 185 186 } | Popular Tags |