1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2008 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#: 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Debug 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>All debugging events that a recognizer can trigger.</summary> 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I did not create a separate AST debugging interface as it would create 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * lots of extra classes and DebugParser has a dbg var defined, which makes 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * it hard to change to ASTDebugEventListener. I looked hard at this issue 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and it is easier to understand as one monolithic event interface for all 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * possible events. Hopefully, adding ST debugging stuff won't be bad. Leave 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for future. 4/26/2006. 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public interface IDebugEventListener 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Initialize(); 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The parser has just entered a rule. No decision has been made about 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which alt is predicted. This is fired AFTER init actions have been 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * executed. Attributes are defined and available etc... 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The grammarFileName allows composite grammars to jump around among 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * multiple grammar files. 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void EnterRule( string grammarFileName, string ruleName ); 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Because rules can have lots of alternatives, it is very useful to 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * know which alt you are entering. This is 1..n for n alts. 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void EnterAlt( int alt ); 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is the last thing executed before leaving a rule. It is 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * executed even if an exception is thrown. This is triggered after 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * error reporting and recovery have occurred (unless the exception is 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * not caught in this rule). This implies an "exitAlt" event. 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The grammarFileName allows composite grammars to jump around among 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * multiple grammar files. 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ExitRule( string grammarFileName, string ruleName ); 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Track entry into any (...) subrule other EBNF construct</summary> */ 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void EnterSubRule( int decisionNumber ); 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ExitSubRule( int decisionNumber ); 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Every decision, fixed k or arbitrary, has an enter/exit event 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so that a GUI can easily track what LT/consume events are 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * associated with prediction. You will see a single enter/exit 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * subrule but multiple enter/exit decision events, one for each 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * loop iteration. 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void EnterDecision(int decisionNumber, bool couldBacktrack); 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ExitDecision( int decisionNumber ); 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * An input token was consumed; matched by any kind of element. 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Trigger after the token was matched by things like match(), matchAny(). 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ConsumeToken( IToken t ); 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * An off-channel input token was consumed. 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Trigger after the token was matched by things like match(), matchAny(). 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (unless of course the hidden token is first stuff in the input stream). 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ConsumeHiddenToken( IToken t ); 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Somebody (anybody) looked ahead. Note that this actually gets 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * triggered by both LA and LT calls. The debugger will want to know 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which Token object was examined. Like consumeToken, this indicates 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * what token was seen at that depth. A remote debugger cannot look 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ahead into a file it doesn't have so LT events must pass the token 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * even if the info is redundant. 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void LT( int i, IToken t ); 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The parser is going to look arbitrarily ahead; mark this location, 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the token stream's marker is sent in case you need it. 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Mark( int marker ); 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * After an arbitrairly long lookahead as with a cyclic DFA (or with 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * any backtrack), this informs the debugger that stream should be 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * rewound to the position associated with marker. 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Rewind( int marker ); 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Rewind to the input position of the last marker. 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Used currently only after a cyclic DFA and just 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * before starting a sem/syn predicate to get the 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * input position back to the start of the decision. 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Do not "pop" the marker off the state. mark(i) 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and rewind(i) should balance still. 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Rewind(); 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void BeginBacktrack( int level ); 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void EndBacktrack( int level, bool successful ); 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * To watch a parser move through the grammar, the parser needs to 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * inform the debugger what line/charPos it is passing in the grammar. 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For now, this does not know how to switch from one grammar to the 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * other and back for island grammars etc... 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This should also allow breakpoints because the debugger can stop 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the parser whenever it hits this line/pos. 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Location( int line, int pos ); 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A recognition exception occurred such as NoViableAltException. I made 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this a generic event so that I can alter the exception hierachy later 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * without having to alter all the debug objects. 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Upon error, the stack of enter rule/subrule must be properly unwound. 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If no viable alt occurs it is within an enter/exit decision, which 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * also must be rewound. Even the rewind for each mark must be unwount. 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * In the Java target this is pretty easy using try/finally, if a bit 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ugly in the generated code. The rewind is generated in DFA.predict() 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * actually so no code needs to be generated for that. For languages 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * w/o this "finally" feature (C++?), the target implementor will have 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to build an event stack or something. 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Across a socket for remote debugging, only the RecognitionException 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * data fields are transmitted. The token object or whatever that 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * caused the problem was the last object referenced by LT. The 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * immediately preceding LT event should hold the unexpected Token or 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * char. 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Here is a sample event trace for grammar: 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * b : C ({;}A|B) // {;} is there to prevent A|B becoming a set 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * | D 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ; 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The sequence for this rule (with no viable alt in the subrule) for 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * input 'c c' (there are 3 tokens) is: 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * commence 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(1) 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * enterRule b 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * location 7 1 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * enter decision 3 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(1) 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * exit decision 3 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * enterAlt1 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * location 7 5 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(1) 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * consumeToken [c/<4>,1:0] 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * location 7 7 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * enterSubRule 2 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * enter decision 2 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(1) 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(1) 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognitionException NoViableAltException 2 1 2 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * exit decision 2 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * exitSubRule 2 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * beginResync 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(1) 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * consumeToken [c/<4>,1:1] 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(1) 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * endResync 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * LT(-1) 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * exitRule b 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * terminate 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void RecognitionException( RecognitionException e ); 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates the recognizer is about to consume tokens to resynchronize 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the parser. Any consume events from here until the recovered event 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are not part of the parse--they are dead tokens. 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void BeginResync(); 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates that the recognizer has finished consuming tokens in order 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to resychronize. There may be multiple beginResync/endResync pairs 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * before the recognizer comes out of errorRecovery mode (in which 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * multiple errors are suppressed). This will be useful 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in a gui where you want to probably grey out tokens that are consumed 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * but not matched to anything in grammar. Anything between 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a beginResync/endResync pair was tossed out by the parser. 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void EndResync(); 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>A semantic predicate was evaluate with this result and action text</summary> */ 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SemanticPredicate( bool result, string predicate ); 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Announce that parsing has begun. Not technically useful except for 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * sending events over a socket. A GUI for example will launch a thread 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to connect and communicate with a remote parser. The thread will want 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to notify the GUI when a connection is made. ANTLR parsers 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * trigger this upon entry to the first rule (the ruleLevel is used to 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * figure this out). 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Commence(); 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Parsing is over; successfully or not. Mostly useful for telling 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * remote debugging listeners that it's time to quit. When the rule 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * invocation level goes to zero at the end of a rule, we are done 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * parsing. 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Terminate(); 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Tree Parsing 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Input for a tree parser is an AST, but we know nothing for sure 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * about a node except its type and text (obtained from the adaptor). 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is the analog of the consumeToken method. Again, the ID is 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the hashCode usually of the node so it only works if hashCode is 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * not implemented. If the type is UP or DOWN, then 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the ID is not really meaningful as it's fixed--there is 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * just one UP node and one DOWN navigation node. 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <param name="t" /> 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ConsumeNode( object t ); 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The tree parser lookedahead. If the type is UP or DOWN, 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * then the ID is not really meaningful as it's fixed--there is 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * just one UP node and one DOWN navigation node. 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void LT( int i, object t ); 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region AST Events 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A nil was created (even nil nodes have a unique ID... 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * they are not "null" per se). As of 4/28/2006, this 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * seems to be uniquely triggered when starting a new subtree 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * such as when entering a subrule in automatic mode and when 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * building a tree in rewrite mode. 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are receiving this event over a socket via 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * RemoteDebugEventSocketListener then only t.ID is set. 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void NilNode( object t ); 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Upon syntax error, recognizers bracket the error with an error node 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * if they are building ASTs. 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <param name="t"/> 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ErrorNode( object t ); 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Announce a new node built from token elements such as type etc...</summary> 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are receiving this event over a socket via 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * RemoteDebugEventSocketListener then only t.ID, type, text are 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * set. 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void CreateNode( object t ); 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Announce a new node built from an existing token.</summary> 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are receiving this event over a socket via 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * RemoteDebugEventSocketListener then only node.ID and token.tokenIndex 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are set. 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void CreateNode( object node, IToken token ); 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Make a node the new root of an existing root. See</summary> 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Note: the newRootID parameter is possibly different 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * than the TreeAdaptor.becomeRoot() newRoot parameter. 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * In our case, it will always be the result of calling 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * TreeAdaptor.becomeRoot() and not root_n or whatever. 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The listener should assume that this event occurs 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * only when the current subrule (or rule) subtree is 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * being reset to newRootID. 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are receiving this event over a socket via 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * RemoteDebugEventSocketListener then only IDs are set. 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <seealso cref="Antlr.Runtime.Tree.TreeAdaptor.becomeRoot()"/> 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void BecomeRoot( object newRoot, object oldRoot ); 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Make childID a child of rootID.</summary> 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are receiving this event over a socket via 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * RemoteDebugEventSocketListener then only IDs are set. 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <seealso cref="Antlr.Runtime.Tree.TreeAdaptor.addChild()"/> 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void AddChild( object root, object child ); 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Set the token start/stop token index for a subtree root or node.</summary> 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you are receiving this event over a socket via 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * RemoteDebugEventSocketListener then only t.ID is set. 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SetTokenBoundaries( object t, int tokenStartIndex, int tokenStopIndex ); 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 388