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