Class Label

java.lang.Object
org.antlr.analysis.Label
All Implemented Interfaces:
Cloneable, Comparable<Label>
Direct Known Subclasses:
ActionLabel, PredicateLabel

public class Label extends Object implements Comparable<Label>, 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 final int
     
    static final int
     
    static final int
     
    static final int
    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 final int
    End of Token is like EOF for lexer rules.
    static final int
     
    static final String
     
    static final int
     
    protected int
    The token type or character value; or, signifies special label.
    protected IntSet
    A set of token types or character codes if label==SET
    static final int
     
    static final int
    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 final int
     
    static final int
    tokens and char range overlap; tokens are MIN_TOKEN_TYPE..n
    static final int
    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 final int
    label is a semantic predicate; implies label is epsilon also
    static final int
    label is a set of tokens or char
    static final int
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    Label(int label)
     
    Label(IntSet labelSet)
    Make a set label
  • Method Summary

    Modifier and Type
    Method
    Description
    void
     
     
    int
     
    boolean
     
    int
    return the single atom label or INVALID if not a single atom
     
     
    int
     
    static boolean
    intersect(Label label, Label edgeLabel)
     
    boolean
     
    boolean
     
    boolean
     
    boolean
     
    boolean
     
    boolean
    matches(int atom)
     
    boolean
    matches(Label other)
     
    boolean
     
    void
     
    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.
     

    Methods inherited from class java.lang.Object

    finalize, getClass, notify, notifyAll, wait, wait, wait
  • Field Details

    • INVALID

      public static final int INVALID
      See Also:
    • ACTION

      public static final int ACTION
      See Also:
    • EPSILON

      public static final int EPSILON
      See Also:
    • EPSILON_STR

      public static final String EPSILON_STR
      See Also:
    • SEMPRED

      public static final int SEMPRED
      label is a semantic predicate; implies label is epsilon also
      See Also:
    • SET

      public static final int SET
      label is a set of tokens or char
      See Also:
    • 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:
    • EOF

      public static final int EOF
      See Also:
    • 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:
    • 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:
    • MIN_CHAR_VALUE

      public static final int MIN_CHAR_VALUE
      See Also:
    • MAX_CHAR_VALUE

      public static final int MAX_CHAR_VALUE
      See Also:
    • 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:
    • DOWN

      public static final int DOWN
      See Also:
    • UP

      public static final int UP
      See Also:
    • MIN_TOKEN_TYPE

      public static final int MIN_TOKEN_TYPE
      tokens and char range overlap; tokens are MIN_TOKEN_TYPE..n
      See Also:
    • 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 Details

    • Label

      public Label(int label)
    • Label

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

    • clone

      public Object clone()
      Overrides:
      clone in class 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)
    • getSemanticContext

      public SemanticContext getSemanticContext()
    • 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 Object
    • equals

      public boolean equals(Object o)
      Overrides:
      equals in class Object
    • compareTo

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

      public 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 Object
    • toString

      public String toString(Grammar g)
    • intersect

      public static boolean intersect(Label label, Label edgeLabel)