boolean _hasCycle(DFAState d, Map<DFAState, Integer> busy) { busy.put(d, CYCLIC_BUSY); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); DFAState target = (DFAState)t.target; int cond = CYCLIC_UNKNOWN; if ( busy.get(target)!=null ) cond = busy.get(target); if ( cond==CYCLIC_BUSY ) return true; if ( cond!=CYCLIC_DONE && _hasCycle(target, busy) ) return true; } busy.put(d, CYCLIC_DONE); return false; }
boolean _hasCycle(DFAState d, Map<DFAState, Integer> busy) { busy.put(d, CYCLIC_BUSY); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); DFAState target = (DFAState)t.target; int cond = CYCLIC_UNKNOWN; if ( busy.get(target)!=null ) cond = busy.get(target); if ( cond==CYCLIC_BUSY ) return true; if ( cond!=CYCLIC_DONE && _hasCycle(target, busy) ) return true; } busy.put(d, CYCLIC_DONE); return false; }
boolean _hasCycle(DFAState d, Map<DFAState, Integer> busy) { busy.put(d, CYCLIC_BUSY); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); DFAState target = (DFAState)t.target; int cond = CYCLIC_UNKNOWN; if ( busy.get(target)!=null ) cond = busy.get(target); if ( cond==CYCLIC_BUSY ) return true; if ( cond!=CYCLIC_DONE && _hasCycle(target, busy) ) return true; } busy.put(d, CYCLIC_DONE); return false; }
/** Return a list of edge labels from start state to targetState. */ public List<IntSet> getEdgeLabels(DFAState targetState) { List<DFAState> dfaStates = getAnyDFAPathToTarget(targetState); List<IntSet> labels = new ArrayList<IntSet>(); for (int i = 0; i < dfaStates.size() - 1; i++) { DFAState d = dfaStates.get(i); DFAState nextState = dfaStates.get(i + 1); // walk looking for edge whose target is next dfa state for (int j = 0; j < d.getNumberOfTransitions(); j++) { Transition e = d.getTransition(j); if (e.target.stateNumber == nextState.stateNumber) { labels.add(e.label.getSet()); } } } return labels; }
/** Return a list of edge labels from start state to targetState. */ public List<IntSet> getEdgeLabels(DFAState targetState) { List<DFAState> dfaStates = getAnyDFAPathToTarget(targetState); List<IntSet> labels = new ArrayList<IntSet>(); for (int i = 0; i < dfaStates.size() - 1; i++) { DFAState d = dfaStates.get(i); DFAState nextState = dfaStates.get(i + 1); // walk looking for edge whose target is next dfa state for (int j = 0; j < d.getNumberOfTransitions(); j++) { Transition e = d.getTransition(j); if (e.target.stateNumber == nextState.stateNumber) { labels.add(e.label.getSet()); } } } return labels; }
/** Return a list of edge labels from start state to targetState. */ public List<IntSet> getEdgeLabels(DFAState targetState) { List<DFAState> dfaStates = getAnyDFAPathToTarget(targetState); List<IntSet> labels = new ArrayList<IntSet>(); for (int i = 0; i < dfaStates.size() - 1; i++) { DFAState d = dfaStates.get(i); DFAState nextState = dfaStates.get(i + 1); // walk looking for edge whose target is next dfa state for (int j = 0; j < d.getNumberOfTransitions(); j++) { Transition e = d.getTransition(j); if (e.target.stateNumber == nextState.stateNumber) { labels.add(e.label.getSet()); } } } return labels; }
public List<DFAState> getAnyDFAPathToTarget(DFAState startState, DFAState targetState, Set<DFAState> visited) { List<DFAState> dfaStates = new ArrayList<DFAState>(); visited.add(startState); if (startState.equals(targetState)) { dfaStates.add(targetState); return dfaStates; } // for (Edge e : startState.edges) { // walk edges looking for valid // path for (int i = 0; i < startState.getNumberOfTransitions(); i++) { Transition e = startState.getTransition(i); if (!visited.contains(e.target)) { List<DFAState> path = getAnyDFAPathToTarget( (DFAState) e.target, targetState, visited); if (path != null) { // found path, we're done dfaStates.add(startState); dfaStates.addAll(path); return dfaStates; } } } return null; }
public List<DFAState> getAnyDFAPathToTarget(DFAState startState, DFAState targetState, Set<DFAState> visited) { List<DFAState> dfaStates = new ArrayList<DFAState>(); visited.add(startState); if (startState.equals(targetState)) { dfaStates.add(targetState); return dfaStates; } // for (Edge e : startState.edges) { // walk edges looking for valid // path for (int i = 0; i < startState.getNumberOfTransitions(); i++) { Transition e = startState.getTransition(i); if (!visited.contains(e.target)) { List<DFAState> path = getAnyDFAPathToTarget( (DFAState) e.target, targetState, visited); if (path != null) { // found path, we're done dfaStates.add(startState); dfaStates.addAll(path); return dfaStates; } } } return null; }
public List<DFAState> getAnyDFAPathToTarget(DFAState startState, DFAState targetState, Set<DFAState> visited) { List<DFAState> dfaStates = new ArrayList<DFAState>(); visited.add(startState); if (startState.equals(targetState)) { dfaStates.add(targetState); return dfaStates; } // for (Edge e : startState.edges) { // walk edges looking for valid // path for (int i = 0; i < startState.getNumberOfTransitions(); i++) { Transition e = startState.getTransition(i); if (!visited.contains(e.target)) { List<DFAState> path = getAnyDFAPathToTarget( (DFAState) e.target, targetState, visited); if (path != null) { // found path, we're done dfaStates.add(startState); dfaStates.addAll(path); return dfaStates; } } } return null; }
int _getMaxLookaheadDepth(DFAState d, int depth) { // not cyclic; don't worry about termination // fail if pred edge. int max = depth; for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); // if ( t.isSemanticPredicate() ) return Integer.MAX_VALUE; if ( !t.isSemanticPredicate() ) { // if pure pred not gated, it must target stop state; don't count DFAState edgeTarget = (DFAState)t.target; int m = _getMaxLookaheadDepth(edgeTarget, depth+1); max = Math.max(max, m); } } return max; }
int _getMaxLookaheadDepth(DFAState d, int depth) { // not cyclic; don't worry about termination // fail if pred edge. int max = depth; for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); // if ( t.isSemanticPredicate() ) return Integer.MAX_VALUE; if ( !t.isSemanticPredicate() ) { // if pure pred not gated, it must target stop state; don't count DFAState edgeTarget = (DFAState)t.target; int m = _getMaxLookaheadDepth(edgeTarget, depth+1); max = Math.max(max, m); } } return max; }
int _getMaxLookaheadDepth(DFAState d, int depth) { // not cyclic; don't worry about termination // fail if pred edge. int max = depth; for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); // if ( t.isSemanticPredicate() ) return Integer.MAX_VALUE; if ( !t.isSemanticPredicate() ) { // if pure pred not gated, it must target stop state; don't count DFAState edgeTarget = (DFAState)t.target; int m = _getMaxLookaheadDepth(edgeTarget, depth+1); max = Math.max(max, m); } } return max; }
boolean _hasSemPred(DFAState d, Set<DFAState> busy) { busy.add(d); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); if ( t.isSemanticPredicate() ) { SemanticContext ctx = t.label.getSemanticContext(); if ( ctx.hasUserSemanticPredicate() ) return true; } DFAState edgeTarget = (DFAState)t.target; if ( !busy.contains(edgeTarget) && _hasSemPred(edgeTarget, busy) ) return true; } return false; }
boolean _hasSemPred(DFAState d, Set<DFAState> busy) { busy.add(d); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); if ( t.isSemanticPredicate() ) { SemanticContext ctx = t.label.getSemanticContext(); if ( ctx.hasUserSemanticPredicate() ) return true; } DFAState edgeTarget = (DFAState)t.target; if ( !busy.contains(edgeTarget) && _hasSemPred(edgeTarget, busy) ) return true; } return false; }
boolean _hasSemPred(DFAState d, Set<DFAState> busy) { busy.add(d); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); if ( t.isSemanticPredicate() ) { SemanticContext ctx = t.label.getSemanticContext(); if ( ctx.hasUserSemanticPredicate() ) return true; } DFAState edgeTarget = (DFAState)t.target; if ( !busy.contains(edgeTarget) && _hasSemPred(edgeTarget, busy) ) return true; } return false; }
boolean _hasSynPred(DFAState d, Set<DFAState> busy) { busy.add(d); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); if ( t.isSemanticPredicate() ) { SemanticContext ctx = t.label.getSemanticContext(); // if ( ctx.toString().indexOf("synpred")>=0 ) { // System.out.println("has pred "+ctx.toString()+" "+ctx.isSyntacticPredicate()); // System.out.println(((SemanticContext.Predicate)ctx).predicateAST.token); // } if ( ctx.isSyntacticPredicate() ) return true; } DFAState edgeTarget = (DFAState)t.target; if ( !busy.contains(edgeTarget) && _hasSynPred(edgeTarget, busy) ) return true; } return false; }
boolean _hasSynPred(DFAState d, Set<DFAState> busy) { busy.add(d); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); if ( t.isSemanticPredicate() ) { SemanticContext ctx = t.label.getSemanticContext(); // if ( ctx.toString().indexOf("synpred")>=0 ) { // System.out.println("has pred "+ctx.toString()+" "+ctx.isSyntacticPredicate()); // System.out.println(((SemanticContext.Predicate)ctx).predicateAST.token); // } if ( ctx.isSyntacticPredicate() ) return true; } DFAState edgeTarget = (DFAState)t.target; if ( !busy.contains(edgeTarget) && _hasSynPred(edgeTarget, busy) ) return true; } return false; }
boolean _hasSynPred(DFAState d, Set<DFAState> busy) { busy.add(d); for (int i=0; i<d.getNumberOfTransitions(); i++) { Transition t = d.transition(i); if ( t.isSemanticPredicate() ) { SemanticContext ctx = t.label.getSemanticContext(); // if ( ctx.toString().indexOf("synpred")>=0 ) { // System.out.println("has pred "+ctx.toString()+" "+ctx.isSyntacticPredicate()); // System.out.println(((SemanticContext.Predicate)ctx).predicateAST.token); // } if ( ctx.isSyntacticPredicate() ) return true; } DFAState edgeTarget = (DFAState)t.target; if ( !busy.contains(edgeTarget) && _hasSynPred(edgeTarget, busy) ) return true; } return false; }
protected void optimizeExitBranches(DFAState d) { Integer sI = Utils.integer(d.stateNumber); if ( visited.contains(sI) ) { return; // already visited } visited.add(sI); int nAlts = d.dfa.getNumberOfAlts(); for (int i = 0; i < d.getNumberOfTransitions(); i++) { Transition edge = d.transition(i); DFAState edgeTarget = ((DFAState)edge.target); /* System.out.println(d.stateNumber+"-"+ edge.label.toString(d.dfa.nfa.grammar)+"->"+ edgeTarget.stateNumber); */ // if target is an accept state and that alt is the exit alt if ( edgeTarget.isAcceptState() && edgeTarget.getUniquelyPredictedAlt()==nAlts) { /* System.out.println("ignoring transition "+i+" to max alt "+ d.dfa.getNumberOfAlts()); */ d.removeTransition(i); i--; // back up one so that i++ of loop iteration stays within bounds } optimizeExitBranches(edgeTarget); } }
protected void optimizeExitBranches(DFAState d) { Integer sI = Utils.integer(d.stateNumber); if ( visited.contains(sI) ) { return; // already visited } visited.add(sI); int nAlts = d.dfa.getNumberOfAlts(); for (int i = 0; i < d.getNumberOfTransitions(); i++) { Transition edge = (Transition) d.transition(i); DFAState edgeTarget = ((DFAState)edge.target); /* System.out.println(d.stateNumber+"-"+ edge.label.toString(d.dfa.nfa.grammar)+"->"+ edgeTarget.stateNumber); */ // if target is an accept state and that alt is the exit alt if ( edgeTarget.isAcceptState() && edgeTarget.getUniquelyPredictedAlt()==nAlts) { /* System.out.println("ignoring transition "+i+" to max alt "+ d.dfa.getNumberOfAlts()); */ d.removeTransition(i); i--; // back up one so that i++ of loop iteration stays within bounds } optimizeExitBranches(edgeTarget); } }