Package org.antlr.v4.runtime
Class RuleContext
java.lang.Object
org.antlr.v4.runtime.RuleContext
- All Implemented Interfaces:
ParseTree
,RuleNode
,SyntaxTree
,Tree
- Direct Known Subclasses:
ParserRuleContext
A rule context is a record of a single rule invocation.
We form a stack of these context objects using the parent
pointer. A parent pointer of null indicates that the current
context is the bottom of the stack. The ParserRuleContext subclass
as a children list so that we can turn this data structure into a
tree.
The root node always has a null pointer and invokingState of -1.
Upon entry to parsing, the first invoked rule function creates a
context object (a subclass specialized for that rule such as
SContext) and makes it the root of a parse tree, recorded by field
Parser._ctx.
public final SContext s() throws RecognitionException {
SContext _localctx = new SContext(_ctx, getState()); invalid input: '<'-- create new node
enterRule(_localctx, 0, RULE_s); invalid input: '<'-- push it
...
exitRule(); invalid input: '<'-- pop back to _localctx
return _localctx;
}
A subsequent rule invocation of r from the start rule s pushes a
new context object for r whose parent points at s and use invoking
state is the state with r emanating as edge label.
The invokingState fields from a context object to the root
together form a stack of rule indication states where the root
(bottom of the stack) has a -1 sentinel value. If we invoke start
symbol s then call r1, which calls r2, the would look like
this:
SContext[-1] invalid input: '<'- root node (bottom of the stack)
R1Context[p] invalid input: '<'- p in rule s called r1
R2Context[q] invalid input: '<'- q in rule r1 called r2
So the top of the stack, _ctx, represents a call to the current
rule and it holds the return address from another rule that invoke
to this rule. To invoke a rule, we must always have a current context.
The parent contexts are useful for computing lookahead sets and
getting error information.
These objects are used during parsing and prediction.
For the special case of parsers, we use the subclass
ParserRuleContext.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final ParserRuleContext
int
What state invoked the rule associated with this context? The "return address" is the followState of invokingState If parent is null, this should be -1 this context object represents the start rule.What context invoked this rule? -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription<T> T
accept
(ParseTreeVisitor<? extends T> visitor) TheParseTreeVisitor
needs a double dispatch method.int
depth()
int
For rule associated with this parse tree internal node, return the outer alternative number used to match the input.getChild
(int i) If there are children, get thei
th value indexed from 0.int
How many children are there? If there is none, then this node represents a leaf node.The parent of this node.This method returns whatever object represents the data at this node.int
Return anInterval
indicating the index in theTokenStream
of the first and last token associated with this subtree.getText()
Return the combined text of all child nodes.boolean
isEmpty()
A context is empty if there is no invoking state; meaning nobody called current context.void
setAltNumber
(int altNumber) Set the outer alternative number for this context node.void
setParent
(RuleContext parent) Set the parent for this node.toString()
final String
toString
(List<String> ruleNames, RuleContext stop) final String
toString
(Recognizer<?, ?> recog) toString
(Recognizer<?, ?> recog, RuleContext stop) Print out a whole tree, not just a node, in LISP format(root child1 .. childN)
.toStringTree
(List<String> ruleNames) Print out a whole tree, not just a node, in LISP format (root child1 ..toStringTree
(Parser recog) Print out a whole tree, not just a node, in LISP format (root child1 ..
-
Field Details
-
EMPTY
-
parent
What context invoked this rule? -
invokingState
public int invokingStateWhat state invoked the rule associated with this context? The "return address" is the followState of invokingState If parent is null, this should be -1 this context object represents the start rule.
-
-
Constructor Details
-
RuleContext
public RuleContext() -
RuleContext
-
-
Method Details
-
depth
public int depth() -
isEmpty
public boolean isEmpty()A context is empty if there is no invoking state; meaning nobody called current context. -
getSourceInterval
Description copied from interface:SyntaxTree
Return anInterval
indicating the index in theTokenStream
of the first and last token associated with this subtree. If this node is a leaf, then the interval represents a single token and has interval i..i for token index i.An interval of i..i-1 indicates an empty interval at position i in the input stream, where 0 <= i <= the size of the input token stream. Currently, the code base can only have i=0..n-1 but in concept one could have an empty interval after EOF.
If source interval is unknown, this returns
Interval.INVALID
.As a weird special case, the source interval for rules matched after EOF is unspecified.
- Specified by:
getSourceInterval
in interfaceSyntaxTree
-
getRuleContext
- Specified by:
getRuleContext
in interfaceRuleNode
-
getParent
Description copied from interface:Tree
The parent of this node. If the return value is null, then this node is the root of the tree. -
getPayload
Description copied from interface:Tree
This method returns whatever object represents the data at this node. For example, for parse trees, the payload can be aToken
representing a leaf node or aRuleContext
object representing a rule invocation. For abstract syntax trees (ASTs), this is aToken
object.- Specified by:
getPayload
in interfaceTree
-
getText
Return the combined text of all child nodes. This method only considers tokens which have been added to the parse tree.Since tokens on hidden channels (e.g. whitespace or comments) are not added to the parse trees, they will not appear in the output of this method.
-
getRuleIndex
public int getRuleIndex() -
getAltNumber
public int getAltNumber()For rule associated with this parse tree internal node, return the outer alternative number used to match the input. Default implementation does not compute nor store this alt num. Create a subclass of ParserRuleContext with backing field and set option contextSuperClass. to set it.- Since:
- 4.5.3
-
setAltNumber
public void setAltNumber(int altNumber) Set the outer alternative number for this context node. Default implementation does nothing to avoid backing field overhead for trees that don't need it. Create a subclass of ParserRuleContext with backing field and set option contextSuperClass.- Since:
- 4.5.3
-
setParent
Description copied from interface:ParseTree
Set the parent for this node. This is not backward compatible as it changes the interface but no one was able to create custom nodes anyway so I'm adding as it improves internal code quality. One could argue for a restructuring of the class/interface hierarchy so that setParent, addChild are moved up to Tree but that's a major change. So I'll do the minimal change, which is to add this method. -
getChild
Description copied from interface:Tree
If there are children, get thei
th value indexed from 0. -
getChildCount
public int getChildCount()Description copied from interface:Tree
How many children are there? If there is none, then this node represents a leaf node.- Specified by:
getChildCount
in interfaceTree
-
accept
Description copied from interface:ParseTree
TheParseTreeVisitor
needs a double dispatch method. -
toStringTree
Print out a whole tree, not just a node, in LISP format (root child1 .. childN). Print just a node if this is a leaf. We have to know the recognizer so we can get rule names.- Specified by:
toStringTree
in interfaceParseTree
-
toStringTree
Print out a whole tree, not just a node, in LISP format (root child1 .. childN). Print just a node if this is a leaf. -
toStringTree
Description copied from interface:Tree
Print out a whole tree, not just a node, in LISP format(root child1 .. childN)
. Print just a node if this is a leaf.- Specified by:
toStringTree
in interfaceTree
-
toString
-
toString
-
toString
-
toString
-
toString
-