Package antlr
Class Lookahead
java.lang.Object
antlr.Lookahead
- All Implemented Interfaces:
Cloneable
This object holds all information needed to represent
the lookahead for any particular lookahead computation
for a single lookahead depth. Final lookahead
information is a simple bit set, but intermediate
stages need computation cycle and FOLLOW information.
} with depth = 4, which
indicates that at 2 (5-4+1) tokens ahead, end of rule was reached.
Therefore, the token at 4=5-(5-4) past rule ref b must be
included in the set == F.
The situation is complicated by the fact that a computation
may hit the end of a rule at many different depths. For example,
Concerning the cycle variable. If lookahead is computed for a RuleEnd node, then computation is part of a FOLLOW cycle for this rule. If lookahead is computed for a RuleBlock node, the computation is part of a FIRST cycle to this rule.
Concerning the epsilonDepth variable. This is not the depth relative to the rule reference that epsilon was encountered. That value is
initial_k - epsilonDepth + 1Also, lookahead depths past rule ref for local follow are:
initial_k - (initial_k - epsilonDepth)Used for rule references. If we try to compute look(k, ruleref) and there are fewer than k lookahead terminals before the end of the the rule, epsilon will be returned (don't want to pass the end of the rule). We must track when the the lookahead got stuck. For example,
a : b A B E F G; b : C ;LOOK(5, ref-to(b)) is {
a : b A B C ; b : E F // epsilon depth of 1 relative to initial k=3 | G // epsilon depth of 2 ;Here, LOOK(3,ref-to(b)) returns epsilon, but the depths are {1, 2}; i.e., 3-(3-1) and 3-(3-2). Those are the lookahead depths past the rule ref needed for the local follow.
This is null unless an epsilon is created.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescription(package private) String
is this computation part of a computation cycle?(package private) BitSet
What k values were being computed when end of rule hit?(package private) BitSet
actual bitset of the lookahead(package private) boolean
Does this lookahead depth include Epsilon token type? This is used to avoid having a bit in the set for Epsilon as it conflicts with parsing binary files. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionclone()
Make a deep copy of everything in this objectvoid
boolean
What is the intersection of two lookahead depths? Only the Epsilon "bit" and bitset are considered.boolean
nil()
static Lookahead
of
(int el) void
void
toString()
toString
(String separator, CharFormatter formatter) toString
(String separator, CharFormatter formatter, Grammar g)
-
Field Details
-
fset
BitSet fsetactual bitset of the lookahead -
cycle
String cycleis this computation part of a computation cycle? -
epsilonDepth
BitSet epsilonDepthWhat k values were being computed when end of rule hit? -
hasEpsilon
boolean hasEpsilonDoes this lookahead depth include Epsilon token type? This is used to avoid having a bit in the set for Epsilon as it conflicts with parsing binary files.
-
-
Constructor Details
-
Lookahead
public Lookahead() -
Lookahead
create a new lookahead set with the LL(1) set to the parameter -
Lookahead
create an empty lookahead set, but with cycle
-
-
Method Details
-
clone
Make a deep copy of everything in this object -
combineWith
-
containsEpsilon
public boolean containsEpsilon() -
intersection
What is the intersection of two lookahead depths? Only the Epsilon "bit" and bitset are considered. -
nil
public boolean nil() -
of
-
resetEpsilon
public void resetEpsilon() -
setEpsilon
public void setEpsilon() -
toString
-
toString
-
toString
-
toString
-