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