protected SemanticContext _getPredicates(NFAState s, NFAState altStartState) { // System.out.println("_getPredicates("+s+")"); if (s.isAcceptState()) { return null; } // avoid infinite loops from (..)* etc... if (lookBusy.contains(s)) { return null; } lookBusy.add(s); Transition transition0 = s.transition[0]; // no transitions if (transition0 == null) { return null; } // not a predicate and not even an epsilon if (!(transition0.label.isSemanticPredicate() || transition0.label.isEpsilon())) { return null; } SemanticContext p = null; SemanticContext p0 = null; SemanticContext p1 = null; if (transition0.label.isSemanticPredicate()) { // System.out.println("pred "+transition0.label); p = transition0.label.getSemanticContext(); // ignore backtracking preds not on left edge for this decision if (((SemanticContext.Predicate) p).predicateAST.getType() == ANTLRParser.BACKTRACK_SEMPRED && s == altStartState.transition[0].target) { p = null; // don't count } } // get preds from beyond this state p0 = _getPredicates((NFAState) transition0.target, altStartState); // get preds from other transition Transition transition1 = s.transition[1]; if (transition1 != null) { p1 = _getPredicates((NFAState) transition1.target, altStartState); } // join this&following-right|following-down return SemanticContext.and(p, SemanticContext.or(p0, p1)); }