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