Class LeftRecursionDetector

  • public class LeftRecursionDetector
    extends Object
    • Field Detail

      • atn

        public ATN atn
      • listOfRecursiveCycles

        public List<Set<Rule>> listOfRecursiveCycles
        Holds a list of cycles (sets of rule names).
    • Constructor Detail

      • LeftRecursionDetector

        public LeftRecursionDetector​(Grammar g,
                                     ATN atn)
    • Method Detail

      • check

        public void check()
      • check

        public boolean check​(Rule enclosingRule,
                             ATNState s,
                             Set<ATNState> visitedStates)
        From state s, look for any transition to a rule that is currently being traced. When tracing r, visitedPerRuleCheck has r initially. If you reach a rule stop state, return but notify the invoking rule that the called rule is nullable. This implies that invoking rule must look at follow transition for that invoking state. The visitedStates tracks visited states within a single rule so we can avoid epsilon-loop-induced infinite recursion here. Keep filling the cycles in listOfRecursiveCycles and also, as a side-effect, set leftRecursiveRules.
      • addRulesToCycle

        protected void addRulesToCycle​(Rule enclosingRule,
                                       Rule targetRule)
        enclosingRule calls targetRule. Find the cycle containing the target and add the caller. Find the cycle containing the caller and add the target. If no cycles contain either, then create a new cycle.