1/** \file
2 * Implementation of the base functionality for an ANTLR3 parser.
3 */
4
5// [The "BSD licence"]
6// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
7// http://www.temporal-wave.com
8// http://www.linkedin.com/in/jimidle
9//
10// All rights reserved.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions
14// are met:
15// 1. Redistributions of source code must retain the above copyright
16//    notice, this list of conditions and the following disclaimer.
17// 2. Redistributions in binary form must reproduce the above copyright
18//    notice, this list of conditions and the following disclaimer in the
19//    documentation and/or other materials provided with the distribution.
20// 3. The name of the author may not be used to endorse or promote products
21//    derived from this software without specific prior written permission.
22//
23// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34#include    <antlr3parser.h>
35
36/* Parser API
37 */
38static void					setDebugListener	(pANTLR3_PARSER parser, pANTLR3_DEBUG_EVENT_LISTENER dbg);
39static void					setTokenStream		(pANTLR3_PARSER parser, pANTLR3_TOKEN_STREAM);
40static pANTLR3_TOKEN_STREAM	getTokenStream		(pANTLR3_PARSER parser);
41static void					freeParser		    (pANTLR3_PARSER parser);
42
43ANTLR3_API pANTLR3_PARSER
44antlr3ParserNewStreamDbg		(ANTLR3_UINT32 sizeHint, pANTLR3_TOKEN_STREAM tstream, pANTLR3_DEBUG_EVENT_LISTENER dbg, pANTLR3_RECOGNIZER_SHARED_STATE state)
45{
46	pANTLR3_PARSER	parser;
47
48	parser = antlr3ParserNewStream(sizeHint, tstream, state);
49
50	if	(parser == NULL)
51    {
52		return	NULL;
53    }
54
55	parser->setDebugListener(parser, dbg);
56
57	return parser;
58}
59
60ANTLR3_API pANTLR3_PARSER
61antlr3ParserNew		(ANTLR3_UINT32 sizeHint, pANTLR3_RECOGNIZER_SHARED_STATE state)
62{
63    pANTLR3_PARSER	parser;
64
65    /* Allocate memory
66     */
67    parser	= (pANTLR3_PARSER) ANTLR3_MALLOC(sizeof(ANTLR3_PARSER));
68
69    if	(parser == NULL)
70    {
71		return	NULL;
72    }
73
74    /* Install a base parser
75     */
76    parser->rec =  antlr3BaseRecognizerNew(ANTLR3_TYPE_PARSER, sizeHint, state);
77
78    if	(parser->rec == NULL)
79    {
80		parser->free(parser);
81		return	NULL;
82    }
83
84    parser->rec->super	= parser;
85
86    /* Parser overrides
87     */
88    parser->rec->exConstruct	=  antlr3MTExceptionNew;
89
90    /* Install the API
91     */
92	parser->setDebugListener	=  setDebugListener;
93    parser->setTokenStream		=  setTokenStream;
94    parser->getTokenStream		=  getTokenStream;
95
96    parser->free			=  freeParser;
97
98    return parser;
99}
100
101ANTLR3_API pANTLR3_PARSER
102antlr3ParserNewStream	(ANTLR3_UINT32 sizeHint, pANTLR3_TOKEN_STREAM tstream, pANTLR3_RECOGNIZER_SHARED_STATE state)
103{
104    pANTLR3_PARSER	parser;
105
106    parser  = antlr3ParserNew(sizeHint, state);
107
108    if	(parser == NULL)
109    {
110		return	NULL;
111    }
112
113    /* Everything seems to be hunky dory so we can install the
114     * token stream.
115     */
116    parser->setTokenStream(parser, tstream);
117
118    return parser;
119}
120
121static void
122freeParser			    (pANTLR3_PARSER parser)
123{
124    if	(parser->rec != NULL)
125    {
126		// This may have ben a delegate or delegator parser, in which case the
127		// state may already have been freed (and set to NULL therefore)
128		// so we ignore the state if we don't have it.
129		//
130		if	(parser->rec->state != NULL)
131		{
132			if	(parser->rec->state->following != NULL)
133			{
134				parser->rec->state->following->free(parser->rec->state->following);
135				parser->rec->state->following = NULL;
136			}
137		}
138	    parser->rec->free(parser->rec);
139	    parser->rec	= NULL;
140
141    }
142    ANTLR3_FREE(parser);
143}
144
145static void
146setDebugListener		(pANTLR3_PARSER parser, pANTLR3_DEBUG_EVENT_LISTENER dbg)
147{
148	// Set the debug listener. There are no methods to override
149	// because currently the only ones that notify the debugger
150	// are error reporting and recovery. Hence we can afford to
151	// check and see if the debugger interface is null or not
152	// there. If there is ever an occasion for a performance
153	// sensitive function to use the debugger interface, then
154	// a replacement function for debug mode should be supplied
155	// and installed here.
156	//
157	parser->rec->debugger	= dbg;
158
159	// If there was a tokenstream installed already
160	// then we need to tell it about the debug interface
161	//
162	if	(parser->tstream != NULL)
163	{
164		parser->tstream->setDebugListener(parser->tstream, dbg);
165	}
166}
167
168static void
169setTokenStream		    (pANTLR3_PARSER parser, pANTLR3_TOKEN_STREAM tstream)
170{
171    parser->tstream = tstream;
172    parser->rec->reset(parser->rec);
173}
174
175static pANTLR3_TOKEN_STREAM
176getTokenStream		    (pANTLR3_PARSER parser)
177{
178    return  parser->tstream;
179}
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194