1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Defines the basic structure to support recognizing by either a lexer,
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * parser, or tree parser.
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \addtogroup ANTLR3_BASE_RECOGNIZER
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @{
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef	_ANTLR3_BASERECOGNIZER_H
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	_ANTLR3_BASERECOGNIZER_H
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3defs.h>
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3exception.h>
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3input.h>
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3tokenstream.h>
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3commontoken.h>
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3commontreenodestream.h>
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include	<antlr3debugeventlistener.h>
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include	<antlr3recognizersharedstate.h>
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Type indicator for a lexer recognizer
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    ANTLR3_TYPE_LEXER		0x0001
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Type indicator for a parser recognizer
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    ANTLR3_TYPE_PARSER		0x0002
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Type indicator for a tree parser recognizer
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    ANTLR3_TYPE_TREE_PARSER	0x0004
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" {
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Base tracking context structure for all types of
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognizers.
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef	struct ANTLR3_BASE_RECOGNIZER_struct
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Whatever super structure is providing this interface needs a pointer to itself
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// so that this can be passed back to it whenever the api functions
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// are called back from here.
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void	      * super;
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Indicates the type of recognizer that we are an instance of.
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The programmer may set this to anything of course, but the default
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// implementations of the interface only really understand the built in
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// types, so new error handlers etc would probably be required to as well.
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  Valid types are:
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   - #ANTLR3_TYPE_LEXER
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///	  - #ANTLR3_TYPE_PARSER
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   - #ANTLR3_TYPE_TREE_PARSER
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	type;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// A pointer to the shared recognizer state, such that multiple
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// recognizers can use the same inputs streams and so on (in
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// the case of grammar inheritance for instance.
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_RECOGNIZER_SHARED_STATE	state;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// If set to something other than NULL, then this structure is
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// points to an instance of the debugger interface. In general, the
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// debugger is only referenced internally in recovery/error operations
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// so that it does not cause overhead by having to check this pointer
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// in every function/method
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_DEBUG_EVENT_LISTENER	debugger;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Pointer to a function that matches the current input symbol
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// against the supplied type. the function causes an error if a
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// match is not found and the default implementation will also
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// attempt to perform one token insertion or deletion if that is
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// possible with the input stream. You can override the default
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// implementation by installing a pointer to your own function
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// in this interface after the recognizer has initialized. This can
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// perform different recovery options or not recover at all and so on.
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// To ignore recovery altogether, see the comments in the default
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// implementation of this function in antlr3baserecognizer.c
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Note that errors are signalled by setting the error flag below
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and creating a new exception structure and installing it in the
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// exception pointer below (you can chain these if you like and handle them
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// in some customized way).
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void *		(*match)	(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow);
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Pointer to a function that matches the next token/char in the input stream
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// regardless of what it actually is.
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*matchAny)	(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Pointer to a function that decides if the token ahead of the current one is the
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// one we were loking for, in which case the curernt one is very likely extraneous
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// and can be reported that way.
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_BOOLEAN
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				(*mismatchIsUnwantedToken)	(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer, pANTLR3_INT_STREAM input, ANTLR3_UINT32 ttype);
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Pointer to a function that decides if the current token is one that can logically
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// follow the one we were looking for, in which case the one we were looking for is
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// probably missing from the input.
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_BOOLEAN
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				(*mismatchIsMissingToken)	(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer, pANTLR3_INT_STREAM input, pANTLR3_BITSET_LIST follow);
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that works out what to do when a token mismatch
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  occurs, so that Tree parsers can behave differently to other recognizers.
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*mismatch)	(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					    ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow);
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function to call to report a recognition problem. You may override
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  this function with your own function, but refer to the standard implementation
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  in antlr3baserecognizer.c for guidance. The function should recognize whether
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  error recovery is in force, so that it does not print out more than one error messages
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  for the same error. From the java comments in BaseRecognizer.java:
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  This method sets errorRecovery to indicate the parser is recovering
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  not parsing.  Once in recovery mode, no errors are generated.
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  To get out of recovery mode, the parser must successfully match
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  a token (after a resync).  So it will go:
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * 		1. error occurs
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * 		2. enter recovery mode, report error
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * 		3. consume until token found in resynch set
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * 		4. try to resume parsing
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * 		5. next match() will reset errorRecovery mode
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*reportError)		    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that is called to display a recognition error message. You may
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  override this function independently of (*reportError)() above as that function calls
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  this one to do the actual exception printing.
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*displayRecognitionError)  (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer, pANTLR3_UINT8 * tokenNames);
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Get number of recognition errors (lexer, parser, tree parser).  Each
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// recognizer tracks its own number.  So parser and lexer each have
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// separate count.  Does not count the spurious errors found between
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// an error and next valid token match
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// \see reportError()
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				(*getNumberOfSyntaxErrors)	(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that recovers from an error found in the input stream.
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  Generally, this will be a #ANTLR3_EXCEPTION_NOVIABLE_ALT but it could also
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  be from a mismatched token that the (*match)() could not recover from.
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*recover)		    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that is a hook to listen to token consumption during error recovery.
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  This is mainly used by the debug parser to send events to the listener.
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*beginResync)		    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that is a hook to listen to token consumption during error recovery.
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  This is mainly used by the debug parser to send events to the listener.
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*endResync)		    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Pointer to a function that is a hook to listen to token consumption during error recovery.
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  This is mainly used by the debug parser to send events to the listener.
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*beginBacktrack)		(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer, ANTLR3_UINT32 level);
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that is a hook to listen to token consumption during error recovery.
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  This is mainly used by the debug parser to send events to the listener.
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*endBacktrack)		    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer, ANTLR3_UINT32 level, ANTLR3_BOOLEAN successful);
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function to computer the error recovery set for the current rule.
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  \see antlr3ComputeErrorRecoverySet() for details.
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BITSET	(*computeErrorRecoverySet)  (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that computes the context-sensitive FOLLOW set for the
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  current rule.
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * \see antlr3ComputeCSRuleFollow() for details.
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BITSET	(*computeCSRuleFollow)	    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function to combine follow bitsets.
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * \see antlr3CombineFollows() for details.
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BITSET	(*combineFollows)	    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    ANTLR3_BOOLEAN exact);
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that recovers from a mismatched token in the input stream.
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * \see antlr3RecoverMismatch() for details.
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		* (*recoverFromMismatchedToken)
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    ANTLR3_UINT32	ttype,
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    pANTLR3_BITSET_LIST	follow);
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that recovers from a mismatched set in the token stream, in a similar manner
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  to (*recoverFromMismatchedToken)
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		* (*recoverFromMismatchedSet) (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    pANTLR3_BITSET_LIST	follow);
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to common routine to handle single token insertion for recovery functions.
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BOOLEAN	(*recoverFromMismatchedElement)
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    pANTLR3_BITSET_LIST	follow);
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that consumes input until the next token matches
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  the given token.
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*consumeUntil)		    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    ANTLR3_UINT32   tokenType);
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that consumes input until the next token matches
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  one in the given set.
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*consumeUntilSet)	    (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							    pANTLR3_BITSET	set);
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that returns an ANTLR3_LIST of the strings that identify
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  the rules in the parser that got you to this point. Can be overridden by installing your
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *	own function set.
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * \todo Document how to override invocation stack functions.
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STACK	(*getRuleInvocationStack)	(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STACK	(*getRuleInvocationStackNamed)  (struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								pANTLR3_UINT8	    name);
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that converts an ANLR3_LIST of tokens to an ANTLR3_LIST of
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  string token names. As this is mostly used in string template processing it may not be useful
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  in the C runtime.
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_HASH_TABLE	(*toStrings)			(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								pANTLR3_HASH_TABLE);
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function to return whether the rule has parsed input starting at the supplied
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  start index before. If the rule has not parsed input starting from the supplied start index,
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  then it will return ANTLR3_MEMO_RULE_UNKNOWN. If it has parsed from the suppled start point
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  then it will return the point where it last stopped parsing after that start point.
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MARKER	(*getRuleMemoization)		(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								ANTLR3_INTKEY	ruleIndex,
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								ANTLR3_MARKER	ruleParseStart);
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that determines whether the rule has parsed input at the current index
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  in the input stream
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BOOLEAN	(*alreadyParsedRule)		(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								ANTLR3_MARKER	ruleIndex);
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that records whether the rule has parsed the input at a
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  current position successfully or not.
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		(*memoize)			(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								ANTLR3_MARKER	ruleIndex,
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								ANTLR3_MARKER	ruleParseStart);
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Pointer to a function that returns the current input symbol.
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The is placed into any label for the associated token ref; e.g., x=ID.  Token
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// and tree parsers need to return different objects. Rather than test
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// for input stream type or change the IntStream interface, I use
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// a simple method to ask the recognizer to tell me what the current
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// input symbol is.
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// This is ignored for lexers and the lexer implementation of this
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// function should return NULL.
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void *		(*getCurrentInputSymbol)	(	struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver												pANTLR3_INT_STREAM istream);
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Conjure up a missing token during error recovery.
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// The recognizer attempts to recover from single missing
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// symbols. But, actions might refer to that missing symbol.
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// For example, x=ID {f($x);}. The action clearly assumes
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// that there has been an identifier matched previously and that
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// $x points at that token. If that token is missing, but
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// the next token in the stream is what we want we assume that
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// this token is missing and we keep going. Because we
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// have to return some token to replace the missing token,
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// we have to conjure one up. This method gives the user control
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// over the tokens returned for missing tokens. Mostly,
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// you will want to create something special for identifier
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// tokens. For literals such as '{' and ',', the default
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// action in the parser or tree parser works. It simply creates
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// a CommonToken of the appropriate type. The text will be the token.
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// If you change what tokens must be created by the lexer,
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// override this method to create the appropriate tokens.
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	void *		(*getMissingSymbol)			(	struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver												pANTLR3_INT_STREAM		istream,
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver												pANTLR3_EXCEPTION		e,
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver												ANTLR3_UINT32			expectedTokenType,
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver												pANTLR3_BITSET_LIST		follow);
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that returns whether the supplied grammar function
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  will parse the current input stream or not. This is the way that syntactic
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  predicates are evaluated. Unlike java, C is perfectly happy to invoke code
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  via a pointer to a function (hence that's what all the ANTLR3 C interfaces
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  do.
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BOOLEAN	(*synpred)			(	struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,  void * ctx,
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver											void (*predicate)(void * ctx));
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that can construct a generic exception structure
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * with such information as the input stream can provide.
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		    (*exConstruct)		(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Reset the recognizer
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		    (*reset)			(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that knows how to free the resources of a base recognizer.
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void			(*free)				(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer);
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BASE_RECOGNIZER;
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3lexer.h>
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3parser.h>
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3treeparser.h>
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// @}
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif	    /* _ANTLR3_BASERECOGNIZER_H	*/
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
372