Package org.antlr.analysis
Class Label
- java.lang.Object
-
- org.antlr.analysis.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 intACTIONstatic intDOWNstatic intEOFstatic intEOR_TOKEN_TYPEEnd 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 intEOTEnd of Token is like EOF for lexer rules.static intEPSILONstatic java.lang.StringEPSILON_STRstatic intINVALIDprotected intlabelThe token type or character value; or, signifies special label.protected IntSetlabelSetA set of token types or character codes if label==SETstatic intMAX_CHAR_VALUEstatic intMIN_ATOM_VALUEAnything 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 intMIN_CHAR_VALUEstatic intMIN_TOKEN_TYPEtokens and char range overlap; tokens are MIN_TOKEN_TYPE..nstatic intNUM_FAUX_LABELSWe 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 intSEMPREDlabel is a semantic predicate; implies label is epsilon alsostatic intSETlabel is a set of tokens or charstatic intUP
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidadd(Label a)java.lang.Objectclone()intcompareTo(Label o)booleanequals(java.lang.Object o)intgetAtom()return the single atom label or INVALID if not a single atomSemanticContextgetSemanticContext()IntSetgetSet()inthashCode()static booleanintersect(Label label, Label edgeLabel)booleanisAction()booleanisAtom()booleanisEpsilon()booleanisSemanticPredicate()booleanisSet()booleanmatches(int atom)booleanmatches(Label other)booleanmatches(IntSet set)voidsetSet(IntSet set)java.lang.StringtoString()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.java.lang.StringtoString(Grammar g)
-
-
-
Field Detail
-
INVALID
public static final int INVALID
- See Also:
- Constant Field Values
-
ACTION
public static final int ACTION
- See Also:
- Constant Field Values
-
EPSILON
public static final int EPSILON
- See Also:
- Constant Field Values
-
EPSILON_STR
public static final java.lang.String EPSILON_STR
- See Also:
- Constant Field Values
-
SEMPRED
public static final int SEMPRED
label is a semantic predicate; implies label is epsilon also- See Also:
- Constant Field Values
-
SET
public static final int SET
label is a set of tokens or char- 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
-
EOF
public static final int EOF
- 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
-
MIN_CHAR_VALUE
public static final int MIN_CHAR_VALUE
- See Also:
- Constant Field Values
-
MAX_CHAR_VALUE
public static final int MAX_CHAR_VALUE
- 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
-
DOWN
public static final int DOWN
- See Also:
- Constant Field Values
-
UP
public static final int UP
- 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:
clonein classjava.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)
-
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:
hashCodein classjava.lang.Object
-
equals
public boolean equals(java.lang.Object o)
- Overrides:
equalsin classjava.lang.Object
-
compareTo
public int compareTo(Label o)
- Specified by:
compareToin interfacejava.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:
toStringin classjava.lang.Object
-
toString
public java.lang.String toString(Grammar g)
-
-