Class LeftRecursionDetector


  • public class LeftRecursionDetector
    extends java.lang.Object
    • Field Summary

      Fields 
      Modifier and Type Field Description
      ATN atn  
      java.util.List<java.util.Set<Rule>> listOfRecursiveCycles
      Holds a list of cycles (sets of rule names).
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void addRulesToCycle​(Rule enclosingRule, Rule targetRule)
      enclosingRule calls targetRule.
      void check()  
      boolean check​(Rule enclosingRule, ATNState s, java.util.Set<ATNState> visitedStates)
      From state s, look for any transition to a rule that is currently being traced.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • atn

        public ATN atn
      • listOfRecursiveCycles

        public java.util.List<java.util.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,
                             java.util.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.