1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Implementation of the base functionality for an ANTLR3 parser.
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3parser.h>
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Parser API
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void					setDebugListener	(pANTLR3_PARSER parser, pANTLR3_DEBUG_EVENT_LISTENER dbg);
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void					setTokenStream		(pANTLR3_PARSER parser, pANTLR3_TOKEN_STREAM);
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_TOKEN_STREAM	getTokenStream		(pANTLR3_PARSER parser);
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void					freeParser		    (pANTLR3_PARSER parser);
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_PARSER
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3ParserNewStreamDbg		(ANTLR3_UINT32 sizeHint, pANTLR3_TOKEN_STREAM tstream, pANTLR3_DEBUG_EVENT_LISTENER dbg, pANTLR3_RECOGNIZER_SHARED_STATE state)
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_PARSER	parser;
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	parser = antlr3ParserNewStream(sizeHint, tstream, state);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(parser == NULL)
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	parser->setDebugListener(parser, dbg);
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return parser;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_PARSER
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3ParserNew		(ANTLR3_UINT32 sizeHint, pANTLR3_RECOGNIZER_SHARED_STATE state)
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_PARSER	parser;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Allocate memory
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser	= (pANTLR3_PARSER) ANTLR3_MALLOC(sizeof(ANTLR3_PARSER));
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(parser == NULL)
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Install a base parser
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->rec =  antlr3BaseRecognizerNew(ANTLR3_TYPE_PARSER, sizeHint, state);
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(parser->rec == NULL)
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		parser->free(parser);
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->rec->super	= parser;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Parser overrides
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->rec->exConstruct	=  antlr3MTExceptionNew;
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Install the API
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	parser->setDebugListener	=  setDebugListener;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->setTokenStream		=  setTokenStream;
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->getTokenStream		=  getTokenStream;
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->free			=  freeParser;
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return parser;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
101324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_PARSER
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3ParserNewStream	(ANTLR3_UINT32 sizeHint, pANTLR3_TOKEN_STREAM tstream, pANTLR3_RECOGNIZER_SHARED_STATE state)
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_PARSER	parser;
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser  = antlr3ParserNew(sizeHint, state);
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(parser == NULL)
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Everything seems to be hunky dory so we can install the
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * token stream.
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->setTokenStream(parser, tstream);
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return parser;
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
122324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfreeParser			    (pANTLR3_PARSER parser)
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(parser->rec != NULL)
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// This may have ben a delegate or delegator parser, in which case the
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// state may already have been freed (and set to NULL therefore)
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// so we ignore the state if we don't have it.
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if	(parser->rec->state != NULL)
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if	(parser->rec->state->following != NULL)
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				parser->rec->state->following->free(parser->rec->state->following);
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				parser->rec->state->following = NULL;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    parser->rec->free(parser->rec);
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    parser->rec	= NULL;
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(parser);
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
146324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetDebugListener		(pANTLR3_PARSER parser, pANTLR3_DEBUG_EVENT_LISTENER dbg)
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Set the debug listener. There are no methods to override
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// because currently the only ones that notify the debugger
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// are error reporting and recovery. Hence we can afford to
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// check and see if the debugger interface is null or not
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// there. If there is ever an occasion for a performance
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// sensitive function to use the debugger interface, then
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// a replacement function for debug mode should be supplied
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// and installed here.
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	parser->rec->debugger	= dbg;
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// If there was a tokenstream installed already
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// then we need to tell it about the debug interface
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(parser->tstream != NULL)
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		parser->tstream->setDebugListener(parser->tstream, dbg);
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
169324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTokenStream		    (pANTLR3_PARSER parser, pANTLR3_TOKEN_STREAM tstream)
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->tstream = tstream;
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser->rec->reset(parser->rec);
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_TOKEN_STREAM
176324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetTokenStream		    (pANTLR3_PARSER parser)
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  parser->tstream;
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194