]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/cpp/DataBoardTest/libantlr3c-3.2/src/antlr3parser.c
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.databoard / cpp / DataBoardTest / libantlr3c-3.2 / src / antlr3parser.c
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  */
38 static void                                     setDebugListener        (pANTLR3_PARSER parser, pANTLR3_DEBUG_EVENT_LISTENER dbg);
39 static void                                     setTokenStream          (pANTLR3_PARSER parser, pANTLR3_TOKEN_STREAM);
40 static pANTLR3_TOKEN_STREAM     getTokenStream          (pANTLR3_PARSER parser);
41 static void                                     freeParser                  (pANTLR3_PARSER parser);
42
43 ANTLR3_API pANTLR3_PARSER
44 antlr3ParserNewStreamDbg                (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
60 ANTLR3_API pANTLR3_PARSER
61 antlr3ParserNew         (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
101 ANTLR3_API pANTLR3_PARSER
102 antlr3ParserNewStream   (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
121 static void             
122 freeParser                          (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
145 static void                                     
146 setDebugListener                (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
168 static void                     
169 setTokenStream              (pANTLR3_PARSER parser, pANTLR3_TOKEN_STREAM tstream)
170 {
171     parser->tstream = tstream;
172     parser->rec->reset(parser->rec);
173 }
174
175 static pANTLR3_TOKEN_STREAM     
176 getTokenStream              (pANTLR3_PARSER parser)
177 {
178     return  parser->tstream;
179 }
180
181
182
183
184
185
186
187
188
189
190
191
192
193