Class Label

  • All Implemented Interfaces:
    java.lang.Cloneable, java.lang.Comparable<Label>
    Direct Known Subclasses:
    ActionLabel, PredicateLabel

    public class Label
    extends java.lang.Object
    implements java.lang.Comparable<Label>, java.lang.Cloneable
    A state machine transition label. A label can be either a simple label such as a token or character. A label can be a set of char or tokens. It can be an epsilon transition. It can be a semantic predicate (which assumes an epsilon transition) or a tree of predicates (in a DFA). Special label types have to be < 0 to avoid conflict with char.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static int ACTION  
      static int DOWN  
      static int EOF  
      static int EOR_TOKEN_TYPE
      End of rule token type; imaginary token type used only for local, partial FOLLOW sets to indicate that the local FOLLOW hit the end of rule.
      static int EOT
      End of Token is like EOF for lexer rules.
      static int EPSILON  
      static java.lang.String EPSILON_STR  
      static int INVALID  
      protected int label
      The token type or character value; or, signifies special label.
      protected IntSet labelSet
      A set of token types or character codes if label==SET
      static int MAX_CHAR_VALUE  
      static int MIN_ATOM_VALUE
      Anything at this value or larger can be considered a simple atom int for easy comparison during analysis only; faux labels are not used during parse time for real token types or char values.
      static int MIN_CHAR_VALUE  
      static int MIN_TOKEN_TYPE
      tokens and char range overlap; tokens are MIN_TOKEN_TYPE..n
      static int NUM_FAUX_LABELS
      We have labels like EPSILON that are below 0; it's hard to store them in an array with negative index so use this constant as an index shift when accessing arrays based upon token type.
      static int SEMPRED
      label is a semantic predicate; implies label is epsilon also
      static int SET
      label is a set of tokens or char
      static int UP  
    • Constructor Summary

      Constructors 
      Constructor Description
      Label​(int label)  
      Label​(IntSet labelSet)
      Make a set label
    • Field Detail

      • SEMPRED

        public static final int SEMPRED
        label is a semantic predicate; implies label is epsilon also
        See Also:
        Constant Field Values
      • EOT

        public static final int EOT
        End of Token is like EOF for lexer rules. It implies that no more characters are available and that NFA conversion should terminate for this path. For example A : 'a' 'b' | 'a' ; yields a DFA predictor: o-a->o-b->1 predict alt 1 | |-EOT->o predict alt 2 To generate code for EOT, treat it as the "default" path, which implies there is no way to mismatch a char for the state from which the EOT emanates.
        See Also:
        Constant Field Values
      • NUM_FAUX_LABELS

        public static final int NUM_FAUX_LABELS
        We have labels like EPSILON that are below 0; it's hard to store them in an array with negative index so use this constant as an index shift when accessing arrays based upon token type. If real token type is i, then array index would be NUM_FAUX_LABELS + i.
        See Also:
        Constant Field Values
      • MIN_ATOM_VALUE

        public static final int MIN_ATOM_VALUE
        Anything at this value or larger can be considered a simple atom int for easy comparison during analysis only; faux labels are not used during parse time for real token types or char values.
        See Also:
        Constant Field Values
      • EOR_TOKEN_TYPE

        public static final int EOR_TOKEN_TYPE
        End of rule token type; imaginary token type used only for local, partial FOLLOW sets to indicate that the local FOLLOW hit the end of rule. During error recovery, the local FOLLOW of a token reference may go beyond the end of the rule and have to use FOLLOW(rule). I have to just shift the token types to 2..n rather than 1..n to accommodate this imaginary token in my bitsets. If I didn't use a bitset implementation for runtime sets, I wouldn't need this. EOF is another candidate for a run time token type for parsers. Follow sets are not computed for lexers so we do not have this issue.
        See Also:
        Constant Field Values
      • MIN_TOKEN_TYPE

        public static final int MIN_TOKEN_TYPE
        tokens and char range overlap; tokens are MIN_TOKEN_TYPE..n
        See Also:
        Constant Field Values
      • label

        protected int label
        The token type or character value; or, signifies special label.
      • labelSet

        protected IntSet labelSet
        A set of token types or character codes if label==SET
    • Constructor Detail

      • Label

        public Label​(int label)
      • Label

        public Label​(IntSet labelSet)
        Make a set label
    • Method Detail

      • clone

        public java.lang.Object clone()
        Overrides:
        clone in class java.lang.Object
      • add

        public void add​(Label a)
      • isAtom

        public boolean isAtom()
      • isEpsilon

        public boolean isEpsilon()
      • isSemanticPredicate

        public boolean isSemanticPredicate()
      • isAction

        public boolean isAction()
      • isSet

        public boolean isSet()
      • getAtom

        public int getAtom()
        return the single atom label or INVALID if not a single atom
      • getSet

        public IntSet getSet()
      • setSet

        public void setSet​(IntSet set)
      • matches

        public boolean matches​(int atom)
      • matches

        public boolean matches​(IntSet set)
      • matches

        public boolean matches​(Label other)
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class java.lang.Object
      • equals

        public boolean equals​(java.lang.Object o)
        Overrides:
        equals in class java.lang.Object
      • compareTo

        public int compareTo​(Label o)
        Specified by:
        compareTo in interface java.lang.Comparable<Label>
      • toString

        public java.lang.String toString()
        Predicates are lists of AST nodes from the NFA created from the grammar, but the same predicate could be cut/paste into multiple places in the grammar. I must compare the text of all the predicates to truly answer whether {p1,p2} .equals {p1,p2}. Unfortunately, I cannot rely on the AST.equals() to work properly so I must do a brute force O(n^2) nested traversal of the Set doing a String compare. At this point, Labels are not compared for equals when they are predicates, but here's the code for future use.
        Overrides:
        toString in class java.lang.Object
      • toString

        public java.lang.String toString​(Grammar g)
      • intersect

        public static boolean intersect​(Label label,
                                        Label edgeLabel)