]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Other/Maintained/Tools/Pccts/h/AToken.h
ef14516ee67cbc7947f5c174f218c6c9db65ac00
[mirror_edk2.git] / EdkCompatibilityPkg / Other / Maintained / Tools / Pccts / h / AToken.h
1 /* ANTLRToken.h
2 *
3 * SOFTWARE RIGHTS
4 *
5 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
6 * Set (PCCTS) -- PCCTS is in the public domain. An individual or
7 * company may do whatever they wish with source code distributed with
8 * PCCTS or the code generated by PCCTS, including the incorporation of
9 * PCCTS, or its output, into commerical software.
10 *
11 * We encourage users to develop software with PCCTS. However, we do ask
12 * that credit is given to us for developing PCCTS. By "credit",
13 * we mean that if you incorporate our source code into one of your
14 * programs (commercial product, research project, or otherwise) that you
15 * acknowledge this fact somewhere in the documentation, research report,
16 * etc... If you like PCCTS and have developed a nice tool with the
17 * output, please mention that you developed it using PCCTS. In
18 * addition, we ask that this header remain intact in our source code.
19 * As long as these guidelines are kept, we expect to continue enhancing
20 * this system and expect to make other tools available as they are
21 * completed.
22 *
23 * ANTLR 1.33
24 * Terence Parr
25 * Parr Research Corporation
26 * with Purdue University and AHPCRC, University of Minnesota
27 * 1989-1998
28 */
29
30 #ifndef ATOKEN_H_GATE
31 #define ATOKEN_H_GATE
32
33 #include "pcctscfg.h"
34
35 #include "pccts_string.h"
36 #include "pccts_stdio.h"
37 #include "pccts_stdlib.h"
38
39 PCCTS_NAMESPACE_STD
40
41 // MR9 RJV (JVincent@novell.com) Not needed for variable length strings
42
43 //// MR9 #ifndef ANTLRCommonTokenTEXTSIZE
44 //// MR9 #define ANTLRCommonTokenTEXTSIZE 100
45 //// MR9 #endif
46
47
48 /* must define what a char looks like; can make this a class too */
49 typedef char ANTLRChar;
50
51 /* D E F I N E S M A R T P O I N T E R S */
52
53 //#include ATOKPTR_H not tested yet, leave out
54 class ANTLRAbstractToken;
55 typedef ANTLRAbstractToken *_ANTLRTokenPtr;
56
57 class ANTLRAbstractToken {
58 public:
59 virtual ~ANTLRAbstractToken() {;}
60 virtual ANTLRTokenType getType() const = 0;
61 virtual void setType(ANTLRTokenType t) = 0;
62 virtual int getLine() const = 0;
63 virtual void setLine(int line) = 0;
64 virtual ANTLRChar *getText() const = 0;
65 virtual void setText(const ANTLRChar *) = 0;
66
67 /* This function will disappear when I can use templates */
68 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt,
69 ANTLRChar *text,
70 int line) = 0;
71
72 /* define to satisfy ANTLRTokenBuffer's need to determine whether or
73 not a token object can be destroyed. If nref()==0, no one has
74 a reference, and the object may be destroyed. This function defaults
75 to 1, hence, if you use deleteTokens() message with a token object
76 not derived from ANTLRCommonRefCountToken, the parser will compile
77 but will not delete objects after they leave the token buffer.
78 */
79
80 virtual unsigned nref() const { return 1; } // MR11
81 virtual void ref() {;}
82 virtual void deref() {;}
83
84 virtual void panic(const char *msg) // MR20 const
85 {
86 fprintf(stderr, "ANTLRAbstractToken panic: %s\n", msg);
87 exit(PCCTS_EXIT_FAILURE);
88 }
89 };
90
91 /* This class should be subclassed. It cannot store token type or text */
92
93 class ANTLRRefCountToken : public ANTLRAbstractToken {
94 public:
95 #ifdef DBG_REFCOUNTTOKEN
96 static int ctor;
97 static int dtor;
98 #endif
99 protected:
100 unsigned refcnt_;
101 #ifdef DBG_REFCOUNTTOKEN
102 char object[200];
103 #endif
104
105 public:
106 ANTLRRefCountToken(ANTLRTokenType t, const ANTLRChar *s)
107 #ifndef DBG_REFCOUNTTOKEN
108 {
109 refcnt_ = 0;
110 }
111 #else
112 {
113 ctor++;
114 refcnt_ = 0;
115 if ( t==1 ) sprintf(object,"tok_EOF");
116 else sprintf(object,"tok_%s",s);
117 fprintf(stderr, "ctor %s #%d\n",object,ctor);
118 }
119 #endif
120 ANTLRRefCountToken()
121 #ifndef DBG_REFCOUNTTOKEN
122 { refcnt_ = 0; }
123 #else
124 {
125 ctor++;
126 refcnt_ = 0;
127 sprintf(object,"tok_blank");
128 fprintf(stderr, "ctor %s #%d\n",object,ctor);
129 }
130 virtual ~ANTLRRefCountToken()
131 {
132 dtor++;
133 if ( dtor>ctor ) fprintf(stderr, "WARNING: dtor>ctor\n");
134 fprintf(stderr, "dtor %s #%d\n", object, dtor);
135 object[0]='\0';
136 }
137 #endif
138
139 // reference counting stuff needed by ANTLRTokenPtr.
140 // User should not access these; for C++ language reasons, we had
141 // to make these public. Yuck.
142
143 void ref() { refcnt_++; }
144 void deref() { refcnt_--; }
145 unsigned nref() const { return refcnt_; } // MR11
146
147 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt,
148 ANTLRChar *txt,
149 int line)
150 {
151 panic("call to ANTLRRefCountToken::makeToken()\n");
152 return NULL;
153 }
154 };
155
156 class ANTLRCommonNoRefCountToken : public ANTLRAbstractToken {
157 protected:
158 ANTLRTokenType _type;
159 int _line;
160 ANTLRChar *_text; // MR9 RJV
161
162 public:
163 ANTLRCommonNoRefCountToken(ANTLRTokenType t, const ANTLRChar *s)
164 { setType(t); _line = 0; _text = NULL; setText(s); }
165 ANTLRCommonNoRefCountToken()
166 { setType((ANTLRTokenType)0); _line = 0; _text = NULL; setText(""); }
167
168 ~ANTLRCommonNoRefCountToken() { if (_text) delete [] _text; } // MR9 RJV: Added Destructor to remove string
169
170 ANTLRTokenType getType() const { return _type; }
171 void setType(ANTLRTokenType t) { _type = t; }
172 virtual int getLine() const { return _line; }
173 void setLine(int line) { _line = line; }
174 ANTLRChar *getText() const { return _text; }
175 int getLength() const { return strlen(getText()); } // MR11
176
177 // MR9 RJV: Added code for variable length strings to setText()
178
179 void setText(const ANTLRChar *s)
180 { if (s != _text) {
181 if (_text) delete [] _text;
182 if (s != NULL) {
183 _text = new ANTLRChar[strlen(s)+1];
184 if (_text == NULL) panic("ANTLRCommonNoRefCountToken::setText new failed");
185 strcpy(_text,s);
186 } else {
187 _text = new ANTLRChar[1];
188 if (_text == NULL) panic("ANTLRCommonNoRefCountToken::setText new failed");
189 strcpy(_text,"");
190 };
191 };
192 }
193
194 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt,
195 ANTLRChar *txt,
196 int line)
197 {
198 ANTLRAbstractToken *t = new ANTLRCommonNoRefCountToken;
199 t->setType(tt); t->setText(txt); t->setLine(line);
200 return t;
201 }
202
203 // MR9 THM Copy constructor required when heap allocated string is used with copy semantics
204
205 ANTLRCommonNoRefCountToken (const ANTLRCommonNoRefCountToken& from) :
206 ANTLRAbstractToken(from) {
207 setType(from._type);
208 setLine(from._line);
209 _text=NULL;
210 setText(from._text);
211 };
212
213 // MR9 THM operator =() required when heap allocated string is used with copy semantics
214
215 virtual ANTLRCommonNoRefCountToken& operator =(const ANTLRCommonNoRefCountToken& rhs) {
216
217 ////// MR15 WatCom can't hack use of operator =()
218 ////// Use this: *( (ANTRLAbstractToken *) this)=rhs;
219
220 *( (ANTLRAbstractToken *) this ) = rhs;
221
222 setType(rhs._type);
223 setLine(rhs._line);
224 setText(rhs._text);
225 return *this;
226 };
227 };
228
229 class ANTLRCommonToken : public ANTLRRefCountToken {
230 protected:
231 ANTLRTokenType _type;
232 int _line;
233 ANTLRChar *_text; // MR9 RJV:Added
234
235 public:
236 ANTLRCommonToken(ANTLRTokenType t, const ANTLRChar *s) : ANTLRRefCountToken(t,s)
237 { setType(t); _line = 0; _text = NULL; setText(s); } // MR9
238 ANTLRCommonToken()
239 { setType((ANTLRTokenType)0); _line = 0; _text = NULL; setText(""); } // MR9
240
241 virtual ~ANTLRCommonToken() { if (_text) delete [] _text; } // MR9 RJV: Added Destructor to remove string
242
243 ANTLRTokenType getType() const { return _type; }
244 void setType(ANTLRTokenType t) { _type = t; }
245 virtual int getLine() const { return _line; }
246 void setLine(int line) { _line = line; }
247 ANTLRChar *getText() const { return _text; }
248 int getLength() const { return strlen(getText()); } // MR11
249
250 // MR9 RJV: Added code for variable length strings to setText()
251
252 void setText(const ANTLRChar *s)
253 { if (s != _text) {
254 if (_text) delete [] _text;
255 if (s != NULL) {
256 _text = new ANTLRChar[strlen(s)+1];
257 if (_text == NULL) panic("ANTLRCommonToken::setText new failed");
258 strcpy(_text,s);
259 } else {
260 _text = new ANTLRChar[1];
261 if (_text == NULL) panic("ANTLRCommonToken::setText new failed");
262 strcpy(_text,"");
263 };
264 };
265 }
266
267 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt,
268 ANTLRChar *txt,
269 int line)
270 {
271 ANTLRAbstractToken *t = new ANTLRCommonToken(tt,txt);
272 t->setLine(line);
273 return t;
274 }
275
276 // MR9 THM Copy constructor required when heap allocated string is used with copy semantics
277
278 ANTLRCommonToken (const ANTLRCommonToken& from) :
279 ANTLRRefCountToken(from) {
280 setType(from._type);
281 setLine(from._line);
282 _text=NULL;
283 setText(from._text);
284 };
285
286 // MR9 THM operator =() required when heap allocated string is used with copy semantics
287
288 virtual ANTLRCommonToken& operator =(const ANTLRCommonToken& rhs) {
289
290 ////// MR15 WatCom can't hack use of operator =()
291 ////// Use this instead: *( (ANTRLRRefCountToken *) this)=rhs;
292
293 *( (ANTLRRefCountToken *) this) = rhs;
294
295 setType(rhs._type);
296 setLine(rhs._line);
297 setText(rhs._text);
298 return *this;
299 };
300 };
301
302 // used for backward compatibility
303 typedef ANTLRCommonToken ANTLRCommonBacktrackingToken;
304
305 #endif