Package org.antlr.runtime.debug
Class ParseTreeBuilder
java.lang.Object
org.antlr.runtime.debug.BlankDebugEventListener
org.antlr.runtime.debug.ParseTreeBuilder
- All Implemented Interfaces:
DebugEventListener
This parser listener tracks rule entry/exit and token matches
to build a simple parse tree using ParseTree nodes.
-
Field Summary
FieldsModifier and TypeFieldDescription(package private) int
(package private) Stack
static final String
(package private) List
Fields inherited from interface org.antlr.runtime.debug.DebugEventListener
FALSE, PROTOCOL_VERSION, TRUE
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
consumeHiddenToken
(Token token) An off-channel input token was consumed.void
consumeToken
(Token token) An input token was consumed; matched by any kind of element.What kind of node to create.void
enterDecision
(int d) Backtracking or cyclic DFA, don't want to add nodes to treevoid
The parser has just entered a rule.void
exitDecision
(int i) void
This is the last thing executed before leaving a rule.getTree()
void
A recognition exception occurred such as NoViableAltException.Methods inherited from class org.antlr.runtime.debug.BlankDebugEventListener
addChild, becomeRoot, beginBacktrack, beginResync, commence, consumeNode, createNode, createNode, endBacktrack, endResync, enterAlt, enterSubRule, errorNode, exitSubRule, location, LT, LT, mark, nilNode, rewind, rewind, semanticPredicate, setTokenBoundaries, terminate
-
Field Details
-
EPSILON_PAYLOAD
- See Also:
-
callStack
Stack callStack -
backtracking
int backtracking
-
-
Constructor Details
-
ParseTreeBuilder
-
-
Method Details
-
getTree
-
create
What kind of node to create. You might want to override so I factored out creation here. -
epsilonNode
-
enterDecision
public void enterDecision(int d) Backtracking or cyclic DFA, don't want to add nodes to tree- Specified by:
enterDecision
in interfaceDebugEventListener
- Overrides:
enterDecision
in classBlankDebugEventListener
-
exitDecision
public void exitDecision(int i) - Specified by:
exitDecision
in interfaceDebugEventListener
- Overrides:
exitDecision
in classBlankDebugEventListener
-
enterRule
Description copied from interface:DebugEventListener
The parser has just entered a rule. No decision has been made about which alt is predicted. This is fired AFTER init actions have been executed. Attributes are defined and available etc... The grammarFileName allows composite grammars to jump around among multiple grammar files.- Specified by:
enterRule
in interfaceDebugEventListener
- Overrides:
enterRule
in classBlankDebugEventListener
-
exitRule
Description copied from interface:DebugEventListener
This is the last thing executed before leaving a rule. It is executed even if an exception is thrown. This is triggered after error reporting and recovery have occurred (unless the exception is not caught in this rule). This implies an "exitAlt" event. The grammarFileName allows composite grammars to jump around among multiple grammar files.- Specified by:
exitRule
in interfaceDebugEventListener
- Overrides:
exitRule
in classBlankDebugEventListener
-
consumeToken
Description copied from interface:DebugEventListener
An input token was consumed; matched by any kind of element. Trigger after the token was matched by things like match(), matchAny().- Specified by:
consumeToken
in interfaceDebugEventListener
- Overrides:
consumeToken
in classBlankDebugEventListener
-
consumeHiddenToken
Description copied from interface:DebugEventListener
An off-channel input token was consumed. Trigger after the token was matched by things like match(), matchAny(). (unless of course the hidden token is first stuff in the input stream).- Specified by:
consumeHiddenToken
in interfaceDebugEventListener
- Overrides:
consumeHiddenToken
in classBlankDebugEventListener
-
recognitionException
Description copied from interface:DebugEventListener
A recognition exception occurred such as NoViableAltException. I made this a generic event so that I can alter the exception hierachy later without having to alter all the debug objects. Upon error, the stack of enter rule/subrule must be properly unwound. If no viable alt occurs it is within an enter/exit decision, which also must be rewound. Even the rewind for each mark must be unwount. In the Java target this is pretty easy using try/finally, if a bit ugly in the generated code. The rewind is generated in DFA.predict() actually so no code needs to be generated for that. For languages w/o this "finally" feature (C++?), the target implementor will have to build an event stack or something. Across a socket for remote debugging, only the RecognitionException data fields are transmitted. The token object or whatever that caused the problem was the last object referenced by LT. The immediately preceding LT event should hold the unexpected Token or char. Here is a sample event trace for grammar: b : C ({;}A|B) // {;} is there to prevent A|B becoming a set | D ; The sequence for this rule (with no viable alt in the subrule) for input 'c c' (there are 3 tokens) is: commence LT(1) enterRule b location 7 1 enter decision 3 LT(1) exit decision 3 enterAlt1 location 7 5 LT(1) consumeToken [c/<4>,1:0] location 7 7 enterSubRule 2 enter decision 2 LT(1) LT(1) recognitionException NoViableAltException 2 1 2 exit decision 2 exitSubRule 2 beginResync LT(1) consumeToken [c/<4>,1:1] LT(1) endResync LT(-1) exitRule b terminate- Specified by:
recognitionException
in interfaceDebugEventListener
- Overrides:
recognitionException
in classBlankDebugEventListener
-