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-2000 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 #include "pccts_stdarg.h" // MR23 39 40 PCCTS_NAMESPACE_STD 41 42 // MR9 RJV (JVincent@novell.com) Not needed for variable length strings 43 44 //// MR9 #ifndef ANTLRCommonTokenTEXTSIZE 45 //// MR9 #define ANTLRCommonTokenTEXTSIZE 100 46 //// MR9 #endif 47 48 49 /* must define what a char looks like; can make this a class too */ 50 typedef char ANTLRChar; 51 52 /* D E F I N E S M A R T P O I N T E R S */ 53 54 //#include ATOKPTR_H not tested yet, leave out 55 class ANTLRAbstractToken; 56 typedef ANTLRAbstractToken *_ANTLRTokenPtr; 57 58 class ANTLRAbstractToken { 59 public: ~ANTLRAbstractToken()60 virtual ~ANTLRAbstractToken() {;} 61 virtual ANTLRTokenType getType() const = 0; 62 virtual void setType(ANTLRTokenType t) = 0; 63 virtual int getLine() const = 0; 64 virtual void setLine(int line) = 0; 65 virtual ANTLRChar *getText() const = 0; 66 virtual void setText(const ANTLRChar *) = 0; 67 68 /* This function will disappear when I can use templates */ 69 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt, 70 ANTLRChar *text, 71 int line) = 0; 72 73 /* define to satisfy ANTLRTokenBuffer's need to determine whether or 74 not a token object can be destroyed. If nref()==0, no one has 75 a reference, and the object may be destroyed. This function defaults 76 to 1, hence, if you use deleteTokens() message with a token object 77 not derived from ANTLRCommonRefCountToken, the parser will compile 78 but will not delete objects after they leave the token buffer. 79 */ 80 nref()81 virtual unsigned nref() const { return 1; } // MR11 ref()82 virtual void ref() {;} deref()83 virtual void deref() {;} 84 panic(const char * msg)85 virtual void panic(const char *msg) // MR20 const 86 { 87 /* MR23 */ printMessage(stderr, "ANTLRAbstractToken panic: %s\n", msg); 88 exit(PCCTS_EXIT_FAILURE); 89 } 90 printMessage(FILE * pFile,const char * pFormat,...)91 virtual int printMessage(FILE* pFile, const char* pFormat, ...) // MR23 92 { 93 va_list marker; 94 va_start( marker, pFormat ); 95 int iRet = vfprintf(pFile, pFormat, marker); 96 va_end( marker ); 97 return iRet; 98 } 99 }; 100 101 /* This class should be subclassed. It cannot store token type or text */ 102 103 class ANTLRRefCountToken : public ANTLRAbstractToken { 104 public: 105 #ifdef DBG_REFCOUNTTOKEN 106 static int ctor; 107 static int dtor; 108 #endif 109 protected: 110 unsigned refcnt_; 111 #ifdef DBG_REFCOUNTTOKEN 112 char object[200]; 113 #endif 114 115 public: 116 117 // MR23 - No matter what you do, you're hammered. 118 // Don't give names to formals something breaks. 119 // Give names to formals and don't use them it breaks. 120 121 #ifndef DBG_REFCOUNTTOKEN ANTLRRefCountToken(ANTLRTokenType,const ANTLRChar *)122 ANTLRRefCountToken(ANTLRTokenType /* t MR23 */, const ANTLRChar * /* s MR23 */) 123 #else 124 ANTLRRefCountToken(ANTLRTokenType t, const ANTLRChar * s) 125 #endif 126 127 #ifndef DBG_REFCOUNTTOKEN 128 { 129 refcnt_ = 0; 130 } 131 #else 132 { 133 ctor++; 134 refcnt_ = 0; 135 if ( t==1 ) sprintf(object,"tok_EOF"); 136 else sprintf(object,"tok_%s",s); 137 /* MR23 */ printMessage(stderr, "ctor %s #%d\n",object,ctor); 138 } 139 #endif ANTLRRefCountToken()140 ANTLRRefCountToken() 141 #ifndef DBG_REFCOUNTTOKEN 142 { refcnt_ = 0; } 143 #else 144 { 145 ctor++; 146 refcnt_ = 0; 147 sprintf(object,"tok_blank"); 148 /* MR23 */ printMessage(stderr, "ctor %s #%d\n",object,ctor); 149 } 150 virtual ~ANTLRRefCountToken() 151 { 152 dtor++; 153 if ( dtor>ctor ) /* MR23 */ printMessage(stderr, "WARNING: dtor>ctor\n"); 154 /* MR23 */ printMessage(stderr, "dtor %s #%d\n", object, dtor); 155 object[0]='\0'; 156 } 157 #endif 158 159 // reference counting stuff needed by ANTLRTokenPtr. 160 // User should not access these; for C++ language reasons, we had 161 // to make these public. Yuck. 162 ref()163 void ref() { refcnt_++; } deref()164 void deref() { refcnt_--; } nref()165 unsigned nref() const { return refcnt_; } // MR11 166 makeToken(ANTLRTokenType,ANTLRChar *,int)167 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType /*tt MR23*/, 168 ANTLRChar * /*txt MR23*/, 169 int /*line MR23*/) 170 { 171 panic("call to ANTLRRefCountToken::makeToken()\n"); 172 return NULL; 173 } 174 }; 175 176 class ANTLRCommonNoRefCountToken : public ANTLRAbstractToken { 177 protected: 178 ANTLRTokenType _type; 179 int _line; 180 ANTLRChar *_text; // MR9 RJV 181 182 public: ANTLRCommonNoRefCountToken(ANTLRTokenType t,const ANTLRChar * s)183 ANTLRCommonNoRefCountToken(ANTLRTokenType t, const ANTLRChar *s) 184 { setType(t); _line = 0; _text = NULL; setText(s); } ANTLRCommonNoRefCountToken()185 ANTLRCommonNoRefCountToken() 186 { setType((ANTLRTokenType)0); _line = 0; _text = NULL; setText(""); } 187 ~ANTLRCommonNoRefCountToken()188 ~ANTLRCommonNoRefCountToken() { if (_text) delete [] _text; } // MR9 RJV: Added Destructor to remove string 189 getType()190 ANTLRTokenType getType() const { return _type; } setType(ANTLRTokenType t)191 void setType(ANTLRTokenType t) { _type = t; } getLine()192 virtual int getLine() const { return _line; } setLine(int line)193 void setLine(int line) { _line = line; } getText()194 ANTLRChar *getText() const { return _text; } getLength()195 int getLength() const { return strlen(getText()); } // MR11 196 197 // MR9 RJV: Added code for variable length strings to setText() 198 setText(const ANTLRChar * s)199 void setText(const ANTLRChar *s) 200 { if (s != _text) { 201 if (_text) delete [] _text; 202 if (s != NULL) { 203 _text = new ANTLRChar[strlen(s)+1]; 204 if (_text == NULL) panic("ANTLRCommonNoRefCountToken::setText new failed"); 205 strcpy(_text,s); 206 } else { 207 _text = new ANTLRChar[1]; 208 if (_text == NULL) panic("ANTLRCommonNoRefCountToken::setText new failed"); 209 strcpy(_text,""); 210 }; 211 }; 212 } 213 makeToken(ANTLRTokenType tt,ANTLRChar * txt,int line)214 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt, 215 ANTLRChar *txt, 216 int line) 217 { 218 ANTLRAbstractToken *t = new ANTLRCommonNoRefCountToken; 219 t->setType(tt); t->setText(txt); t->setLine(line); 220 return t; 221 } 222 223 // MR9 THM Copy constructor required when heap allocated string is used with copy semantics 224 ANTLRCommonNoRefCountToken(const ANTLRCommonNoRefCountToken & from)225 ANTLRCommonNoRefCountToken (const ANTLRCommonNoRefCountToken& from) : 226 ANTLRAbstractToken(from) { 227 setType(from._type); 228 setLine(from._line); 229 _text=NULL; 230 setText(from._text); 231 }; 232 233 // MR9 THM operator =() required when heap allocated string is used with copy semantics 234 235 virtual ANTLRCommonNoRefCountToken& operator =(const ANTLRCommonNoRefCountToken& rhs) { 236 237 ////// MR15 WatCom can't hack use of operator =() 238 ////// Use this: *( (ANTRLAbstractToken *) this)=rhs; 239 240 *( (ANTLRAbstractToken *) this ) = rhs; 241 242 setType(rhs._type); 243 setLine(rhs._line); 244 setText(rhs._text); 245 return *this; 246 }; 247 }; 248 249 class ANTLRCommonToken : public ANTLRRefCountToken { 250 protected: 251 ANTLRTokenType _type; 252 int _line; 253 ANTLRChar *_text; // MR9 RJV:Added 254 255 public: ANTLRCommonToken(ANTLRTokenType t,const ANTLRChar * s)256 ANTLRCommonToken(ANTLRTokenType t, const ANTLRChar *s) : ANTLRRefCountToken(t,s) 257 { setType(t); _line = 0; _text = NULL; setText(s); } // MR9 ANTLRCommonToken()258 ANTLRCommonToken() 259 { setType((ANTLRTokenType)0); _line = 0; _text = NULL; setText(""); } // MR9 260 ~ANTLRCommonToken()261 virtual ~ANTLRCommonToken() { if (_text) delete [] _text; } // MR9 RJV: Added Destructor to remove string 262 getType()263 ANTLRTokenType getType() const { return _type; } setType(ANTLRTokenType t)264 void setType(ANTLRTokenType t) { _type = t; } getLine()265 virtual int getLine() const { return _line; } setLine(int line)266 void setLine(int line) { _line = line; } getText()267 ANTLRChar *getText() const { return _text; } getLength()268 int getLength() const { return strlen(getText()); } // MR11 269 270 // MR9 RJV: Added code for variable length strings to setText() 271 setText(const ANTLRChar * s)272 void setText(const ANTLRChar *s) 273 { if (s != _text) { 274 if (_text) delete [] _text; 275 if (s != NULL) { 276 _text = new ANTLRChar[strlen(s)+1]; 277 if (_text == NULL) panic("ANTLRCommonToken::setText new failed"); 278 strcpy(_text,s); 279 } else { 280 _text = new ANTLRChar[1]; 281 if (_text == NULL) panic("ANTLRCommonToken::setText new failed"); 282 strcpy(_text,""); 283 }; 284 }; 285 } 286 makeToken(ANTLRTokenType tt,ANTLRChar * txt,int line)287 virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt, 288 ANTLRChar *txt, 289 int line) 290 { 291 ANTLRAbstractToken *t = new ANTLRCommonToken(tt,txt); 292 t->setLine(line); 293 return t; 294 } 295 296 // MR9 THM Copy constructor required when heap allocated string is used with copy semantics 297 ANTLRCommonToken(const ANTLRCommonToken & from)298 ANTLRCommonToken (const ANTLRCommonToken& from) : 299 ANTLRRefCountToken(from) { 300 setType(from._type); 301 setLine(from._line); 302 _text=NULL; 303 setText(from._text); 304 }; 305 306 // MR9 THM operator =() required when heap allocated string is used with copy semantics 307 308 virtual ANTLRCommonToken& operator =(const ANTLRCommonToken& rhs) { 309 310 ////// MR15 WatCom can't hack use of operator =() 311 ////// Use this instead: *( (ANTRLRRefCountToken *) this)=rhs; 312 313 *( (ANTLRRefCountToken *) this) = rhs; 314 315 setType(rhs._type); 316 setLine(rhs._line); 317 setText(rhs._text); 318 return *this; 319 }; 320 }; 321 322 // used for backward compatibility 323 typedef ANTLRCommonToken ANTLRCommonBacktrackingToken; 324 325 #endif 326