1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \file
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The definition of all debugging events that a recognizer can trigger.
43447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein *
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remark
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  From the java implementation by Terence Parr...
73447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein *  I did not create a separate AST debugging interface as it would create
83447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein *  lots of extra classes and DebugParser has a dbg var defined, which makes
93447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein *  it hard to change to ASTDebugEventListener.  I looked hard at this issue
103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein *  and it is easier to understand as one monolithic event interface for all
113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein *  possible events.  Hopefully, adding ST debugging stuff won't be bad.  Leave
123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein *  for future. 4/26/2006.
133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef	ANTLR3_DEBUG_EVENT_LISTENER_H
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	ANTLR3_DEBUG_EVENT_LISTENER_H
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3defs.h>
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3basetree.h>
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3commontoken.h>
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Default debugging port
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define DEFAULT_DEBUGGER_PORT		0xBFCC;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" {
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The ANTLR3 debugging interface for communicating with ANLTR Works. Function comments
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mostly taken from the Java version.
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct ANTLR3_DEBUG_EVENT_LISTENER_struct
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// The port number which the debug listener should listen on for a connection
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32		port;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// The socket structure we receive after a successful accept on the serverSocket
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	SOCKET				socket;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** The version of the debugging protocol supported by the providing
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  instance of the debug event listener.
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int					PROTOCOL_VERSION;
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// The name of the grammar file that we are debugging
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING		grammarFileName;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Indicates whether we have already connected or not
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_BOOLEAN		initialized;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Used to serialize the values of any particular token we need to
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// send back to the debugger.
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING		tokenString;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Allows the debug event system to access the adapter in use
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// by the recognizer, if this is a tree parser of some sort.
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE_ADAPTOR	adaptor;
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Wait for a connection from the debugger and initiate the
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// debugging session.
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_BOOLEAN	(*handshake)		(pANTLR3_DEBUG_EVENT_LISTENER delboy);
1013447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1023447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** The parser has just entered a rule.  No decision has been made about
1033447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  which alt is predicted.  This is fired AFTER init actions have been
1043447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  executed.  Attributes are defined and available etc...
1053447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*enterRule)		(pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName);
1073447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1083447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Because rules can have lots of alternatives, it is very useful to
1093447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  know which alt you are entering.  This is 1..n for n alts.
1103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*enterAlt)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, int alt);
1123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** This is the last thing executed before leaving a rule.  It is
1143447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  executed even if an exception is thrown.  This is triggered after
1153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  error reporting and recovery have occurred (unless the exception is
1163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  not caught in this rule).  This implies an "exitAlt" event.
1173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*exitRule)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName);
1193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Track entry into any (...) subrule other EBNF construct
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*enterSubRule)		(pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber);
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*exitSubRule)		(pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber);
1253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Every decision, fixed k or arbitrary, has an enter/exit event
1273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  so that a GUI can easily track what LT/consume events are
1283447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  associated with prediction.  You will see a single enter/exit
1293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  subrule but multiple enter/exit decision events, one for each
1303447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  loop iteration.
1313447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*enterDecision)	(pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber);
1333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*exitDecision)		(pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber);
1353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** An input token was consumed; matched by any kind of element.
1373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Trigger after the token was matched by things like match(), matchAny().
1383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*consumeToken)		(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t);
1403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** An off-channel input token was consumed.
1423447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Trigger after the token was matched by things like match(), matchAny().
1433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  (unless of course the hidden token is first stuff in the input stream).
1443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*consumeHiddenToken)	(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t);
1463447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Somebody (anybody) looked ahead.  Note that this actually gets
1483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  triggered by both LA and LT calls.  The debugger will want to know
1493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  which Token object was examined.  Like consumeToken, this indicates
1503447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  what token was seen at that depth.  A remote debugger cannot look
1513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  ahead into a file it doesn't have so LT events must pass the token
1523447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  even if the info is redundant.
1533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*LT)				(pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_COMMON_TOKEN t);
1553447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** The parser is going to look arbitrarily ahead; mark this location,
1573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  the token stream's marker is sent in case you need it.
1583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*mark)				(pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker);
1603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** After an arbitrarily long lookahead as with a cyclic DFA (or with
1623447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  any backtrack), this informs the debugger that stream should be
1633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  rewound to the position associated with marker.
1643447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*rewind)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker);
1663447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Rewind to the input position of the last marker.
1683447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Used currently only after a cyclic DFA and just
1693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  before starting a sem/syn predicate to get the
1703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  input position back to the start of the decision.
1713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Do not "pop" the marker off the state.  mark(i)
1723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  and rewind(i) should balance still.
1733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*rewindLast)		(pANTLR3_DEBUG_EVENT_LISTENER delboy);
1753447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*beginBacktrack)	(pANTLR3_DEBUG_EVENT_LISTENER delboy, int level);
1773447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*endBacktrack)		(pANTLR3_DEBUG_EVENT_LISTENER delboy, int level, ANTLR3_BOOLEAN successful);
1793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** To watch a parser move through the grammar, the parser needs to
1813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  inform the debugger what line/charPos it is passing in the grammar.
1823447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  For now, this does not know how to switch from one grammar to the
1833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  other and back for island grammars etc...
1843447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
1853447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  This should also allow breakpoints because the debugger can stop
1863447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  the parser whenever it hits this line/pos.
1873447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*location)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, int line, int pos);
1893447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
1903447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** A recognition exception occurred such as NoViableAltException.  I made
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  this a generic event so that I can alter the exception hierarchy later
1923447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  without having to alter all the debug objects.
1933447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
1943447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Upon error, the stack of enter rule/subrule must be properly unwound.
1953447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  If no viable alt occurs it is within an enter/exit decision, which
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  also must be rewound.  Even the rewind for each mark must be unwound.
1973447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  In the Java target this is pretty easy using try/finally, if a bit
1983447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  ugly in the generated code.  The rewind is generated in DFA.predict()
1993447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  actually so no code needs to be generated for that.  For languages
2003447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  w/o this "finally" feature (C++?), the target implementor will have
2013447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  to build an event stack or something.
2023447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
2033447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Across a socket for remote debugging, only the RecognitionException
2043447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  data fields are transmitted.  The token object or whatever that
2053447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  caused the problem was the last object referenced by LT.  The
2063447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  immediately preceding LT event should hold the unexpected Token or
2073447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  char.
2083447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
2093447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Here is a sample event trace for grammar:
2103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
2113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
2123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein     *    | D
2133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein     *    ;
2143447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein     *
2153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  The sequence for this rule (with no viable alt in the subrule) for
2163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  input 'c c' (there are 3 tokens) is:
2173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
2183447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		commence
2193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(1)
2203447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		enterRule b
2213447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		location 7 1
2223447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		enter decision 3
2233447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(1)
2243447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		exit decision 3
2253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		enterAlt1
2263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		location 7 5
2273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(1)
2283447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		consumeToken [c/<4>,1:0]
2293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		location 7 7
2303447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		enterSubRule 2
2313447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		enter decision 2
2323447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(1)
2333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(1)
2343447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		recognitionException NoViableAltException 2 1 2
2353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		exit decision 2
2363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		exitSubRule 2
2373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		beginResync
2383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(1)
2393447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		consumeToken [c/<4>,1:1]
2403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(1)
2413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		endResync
2423447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		LT(-1)
2433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		exitRule b
2443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *		terminate
2453447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*recognitionException)	(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_EXCEPTION e);
2473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
2483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Indicates the recognizer is about to consume tokens to resynchronize
2493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  the parser.  Any consume events from here until the recovered event
2503447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  are not part of the parse--they are dead tokens.
2513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*beginResync)			(pANTLR3_DEBUG_EVENT_LISTENER delboy);
2533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
2543447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Indicates that the recognizer has finished consuming tokens in order
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  to resynchronize.  There may be multiple beginResync/endResync pairs
2563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  before the recognizer comes out of errorRecovery mode (in which
2573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  multiple errors are suppressed).  This will be useful
2583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  in a gui where you want to probably grey out tokens that are consumed
2593447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  but not matched to anything in grammar.  Anything between
2603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  a beginResync/endResync pair was tossed out by the parser.
2613447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*endResync)			(pANTLR3_DEBUG_EVENT_LISTENER delboy);
2633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** A semantic predicate was evaluate with this result and action text
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*semanticPredicate)	(pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_BOOLEAN result, const char * predicate);
2673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
2683447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Announce that parsing has begun.  Not technically useful except for
2693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  sending events over a socket.  A GUI for example will launch a thread
2703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  to connect and communicate with a remote parser.  The thread will want
2713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  to notify the GUI when a connection is made.  ANTLR parsers
2723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  trigger this upon entry to the first rule (the ruleLevel is used to
2733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  figure this out).
2743447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*commence)				(pANTLR3_DEBUG_EVENT_LISTENER delboy);
2763447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
2773447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Parsing is over; successfully or not.  Mostly useful for telling
2783447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  remote debugging listeners that it's time to quit.  When the rule
2793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  invocation level goes to zero at the end of a rule, we are done
2803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  parsing.
2813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*terminate)			(pANTLR3_DEBUG_EVENT_LISTENER delboy);
2833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Retrieve acknowledge response from the debugger. in fact this
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// response is never used at the moment. So we just read whatever
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// is in the socket buffer and throw it away.
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*ack)					(pANTLR3_DEBUG_EVENT_LISTENER delboy);
2893447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
2903447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	// T r e e  P a r s i n g
2913447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
2923447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Input for a tree parser is an AST, but we know nothing for sure
2933447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  about a node except its type and text (obtained from the adaptor).
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  This is the analog of the consumeToken method.  The ID is usually
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  the memory address of the node.
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  If the type is UP or DOWN, then
2973447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  the ID is not really meaningful as it's fixed--there is
2983447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  just one UP node and one DOWN navigation node.
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  Note that unlike the Java version, the node type of the C parsers
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  is always fixed as pANTLR3_BASE_TREE because all such structures
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  contain a super pointer to their parent, which is generally COMMON_TREE and within
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  that there is a super pointer that can point to a user type that encapsulates it.
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  Almost akin to saying that it is an interface pointer except we don't need to
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  know what the interface is in full, just those bits that are the base.
3063447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 * @param t
3073447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*consumeNode)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t);
3093447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** The tree parser looked ahead.  If the type is UP or DOWN,
3113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  then the ID is not really meaningful as it's fixed--there is
3123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  just one UP node and one DOWN navigation node.
3133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*LTT)					(pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_BASE_TREE t);
3153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	// A S T  E v e n t s
3183447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** A nil was created (even nil nodes have a unique ID...
3203447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  they are not "null" per se).  As of 4/28/2006, this
3213447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  seems to be uniquely triggered when starting a new subtree
3223447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  such as when entering a subrule in automatic mode and when
3233447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  building a tree in rewrite mode.
3243447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein     *
3253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 	 *  If you are receiving this event over a socket via
3263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  RemoteDebugEventSocketListener then only t.ID is set.
3273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*nilNode)				(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t);
3293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** If a syntax error occurs, recognizers bracket the error
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  with an error node if they are building ASTs. This event
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  notifies the listener that this is the case
3333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*errorNode)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t);
3353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Announce a new node built from token elements such as type etc...
3373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  If you are receiving this event over a socket via
3393447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  RemoteDebugEventSocketListener then only t.ID, type, text are
3403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  set.
3413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*createNode)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t);
3433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Announce a new node built from an existing token.
3453447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3463447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  If you are receiving this event over a socket via
3473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  RemoteDebugEventSocketListener then only node.ID and token.tokenIndex
3483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  are set.
3493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*createNodeTok)		(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE node, pANTLR3_COMMON_TOKEN token);
3513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3523447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Make a node the new root of an existing root.  See
3533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3543447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  Note: the newRootID parameter is possibly different
3553447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  than the TreeAdaptor.becomeRoot() newRoot parameter.
3563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  In our case, it will always be the result of calling
3573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  TreeAdaptor.becomeRoot() and not root_n or whatever.
3583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3593447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  The listener should assume that this event occurs
3603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  only when the current subrule (or rule) subtree is
3613447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  being reset to newRootID.
3623447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  If you are receiving this event over a socket via
3643447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  RemoteDebugEventSocketListener then only IDs are set.
3653447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3663447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  @see org.antlr.runtime.tree.TreeAdaptor.becomeRoot()
3673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*becomeRoot)			(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot);
3693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Make childID a child of rootID.
3713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  If you are receiving this event over a socket via
3733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  RemoteDebugEventSocketListener then only IDs are set.
3743447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3753447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
3763447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*addChild)				(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE root, pANTLR3_BASE_TREE child);
3783447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein
3793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	/** Set the token start/stop token index for a subtree root or node.
3803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *
3813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  If you are receiving this event over a socket via
3823447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 *  RemoteDebugEventSocketListener then only t.ID is set.
3833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein	 */
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*setTokenBoundaries)	(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t, ANTLR3_MARKER tokenStartIndex, ANTLR3_MARKER tokenStopIndex);
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Free up the resources allocated to this structure
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void			(*free)					(pANTLR3_DEBUG_EVENT_LISTENER delboy);
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_DEBUG_EVENT_LISTENER;
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
3943447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein}
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
399