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