Package org.antlr.runtime.debug
Class ParseTreeBuilder
- java.lang.Object
-
- org.antlr.runtime.debug.BlankDebugEventListener
-
- org.antlr.runtime.debug.ParseTreeBuilder
-
- All Implemented Interfaces:
DebugEventListener
public class ParseTreeBuilder extends BlankDebugEventListener
This parser listener tracks rule entry/exit and token matches to build a simple parse tree using ParseTree nodes.
-
-
Field Summary
Fields Modifier and Type Field Description static String
EPSILON_PAYLOAD
-
Fields inherited from interface org.antlr.runtime.debug.DebugEventListener
FALSE, PROTOCOL_VERSION, TRUE
-
-
Constructor Summary
Constructors Constructor Description ParseTreeBuilder(String grammarName)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
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.ParseTree
create(Object payload)
What kind of node to create.void
enterDecision(int d, boolean couldBacktrack)
Backtracking or cyclic DFA, don't want to add nodes to treevoid
enterRule(String filename, String ruleName)
The parser has just entered a rule.ParseTree
epsilonNode()
void
exitDecision(int i)
void
exitRule(String filename, String ruleName)
This is the last thing executed before leaving a rule.ParseTree
getTree()
void
recognitionException(RecognitionException e)
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 Detail
-
EPSILON_PAYLOAD
public static final String EPSILON_PAYLOAD
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
ParseTreeBuilder
public ParseTreeBuilder(String grammarName)
-
-
Method Detail
-
getTree
public ParseTree getTree()
-
create
public ParseTree create(Object payload)
What kind of node to create. You might want to override so I factored out creation here.
-
epsilonNode
public ParseTree epsilonNode()
-
enterDecision
public void enterDecision(int d, boolean couldBacktrack)
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
public void enterRule(String filename, String ruleName)
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
public void exitRule(String filename, String ruleName)
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
public void consumeToken(Token token)
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
public void consumeHiddenToken(Token token)
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
public void recognitionException(RecognitionException e)
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
-
-