Main Page   Alphabetical List   Compound List   File List   Compound Members   File Members  

ltoken.c

Go to the documentation of this file.
00001 /*
00002 ** LCLint - annotation-assisted static program checker
00003 ** Copyright (C) 1994-2000 University of Virginia,
00004 **         Massachusetts Institute of Technology
00005 **
00006 ** This program is free software; you can redistribute it and/or modify it
00007 ** under the terms of the GNU General Public License as published by the
00008 ** Free Software Foundation; either version 2 of the License, or (at your
00009 ** option) any later version.
00010 ** 
00011 ** This program is distributed in the hope that it will be useful, but
00012 ** WITHOUT ANY WARRANTY; without even the implied warranty of
00013 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 ** General Public License for more details.
00015 ** 
00016 ** The GNU General Public License is available from http://www.gnu.org/ or
00017 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00018 ** MA 02111-1307, USA.
00019 **
00020 ** For information on lclint: lclint-request@cs.virginia.edu
00021 ** To report a bug: lclint-bug@cs.virginia.edu
00022 ** For more information: http://lclint.cs.virginia.edu
00023 */
00024 /*
00025 ** ltoken.c
00026 */
00027 
00028 # include "lclintMacros.nf"
00029 # include "llbasic.h"
00030 # include "llgrammar.h"
00031 # include "scanline.h"
00032 # include "lclscanline.h"
00033 
00034 /* 
00035 ** Place to store the \keyword (\forall ...) tokens.  These tokens will     
00036 ** have to be modified when the extensionChar ("\") changes.                
00037 ** set in LCLScanLineInit of lclscanline.c or in scanline.c 
00038 */
00039 
00040 /*@-namechecks@*/
00041 ltoken ltoken_forall;
00042 ltoken ltoken_exists;
00043 ltoken ltoken_true;
00044 ltoken ltoken_false;
00045 ltoken ltoken_not;
00046 ltoken ltoken_and;
00047 ltoken ltoken_or;
00048 ltoken ltoken_implies;
00049 ltoken ltoken_eq;
00050 ltoken ltoken_neq;
00051 ltoken ltoken_equals;
00052 ltoken ltoken_eqsep;
00053 ltoken ltoken_select;
00054 ltoken ltoken_open;
00055 ltoken ltoken_sep;
00056 ltoken ltoken_close;
00057 ltoken ltoken_id;
00058 ltoken ltoken_arrow;
00059 ltoken ltoken_marker;
00060 ltoken ltoken_pre;
00061 ltoken ltoken_post;
00062 ltoken ltoken_comment;
00063 ltoken ltoken_any;
00064 ltoken ltoken_compose;
00065 ltoken ltoken_if;
00066 ltoken ltoken_result;
00067 ltoken ltoken_typename;
00068 ltoken ltoken_bool;
00069 ltoken ltoken_farrow;
00070 ltoken ltoken_lbracked;
00071 ltoken ltoken_rbracket;
00072 /*@=namechecks@*/
00073 
00074 static /*@notnull@*/ ltoken ltoken_new (void)
00075 {
00076   ltoken tok = (ltoken) dmalloc (sizeof (*tok));
00077 
00078   tok->code = NOTTOKEN;
00079   tok->col = 0;
00080   tok->line = 0;
00081   tok->text = lsymbol_undefined;
00082   tok->fname = lsymbol_undefined;
00083   tok->rawText = lsymbol_undefined;
00084   tok->defined = FALSE;
00085   tok->hasSyn = FALSE;
00086 
00087   return tok;
00088 }
00089 
00090 ltoken ltoken_create (unsigned int code, lsymbol text)
00091 {
00092   ltoken tok = ltoken_new ();
00093 
00094   tok->code = code;
00095   tok->text = text;
00096   
00097   return tok;
00098 }
00099 
00100 ltoken ltoken_createRaw (unsigned int code, lsymbol text)
00101 {
00102   ltoken tok = ltoken_new ();
00103 
00104   tok->code = code;
00105   tok->rawText = text;
00106 
00107   return tok;
00108 }
00109 
00110 ltoken ltoken_createType (unsigned int code, SimpleIdCode idtype, lsymbol text)
00111 {
00112   ltoken tok = ltoken_new ();
00113 
00114   /* no...what's the real llassert (code == simpleId); */
00115 
00116   tok->code = code;
00117   tok->idtype = idtype;
00118   tok->text = text;
00119   
00120   return tok;
00121 }
00122 
00123 ltoken ltoken_createFull (unsigned int code, lsymbol text, 
00124                           cstring file, unsigned int line, 
00125                           unsigned int col)
00126 {
00127   ltoken tok = (ltoken) dmalloc (sizeof (*tok));
00128   
00129   tok->code = code;
00130   tok->text = text;
00131   tok->fname = lsymbol_fromString (file);
00132   tok->line = line;
00133   tok->col = col;
00134   tok->rawText = lsymbol_undefined;
00135   tok->defined = FALSE;
00136   tok->hasSyn = FALSE;
00137   
00138   return tok;
00139 }
00140 
00141 static /*@only@*/ cstring LCLTokenCode_unparseCodeName (unsigned int t)
00142 {
00143   switch (t)
00144     {
00145     case NOTTOKEN:         return cstring_makeLiteral ("*** NOTTOKEN ***");
00146     case quantifierSym:    return cstring_makeLiteral ("QUANTIFIERSYM");      
00147     case logicalOp:        return cstring_makeLiteral ("LOGICALOP");
00148     case selectSym:        return cstring_makeLiteral ("SELECTSYM");    
00149     case openSym:          return cstring_makeLiteral ("OPENSYM");
00150     case preSym:           return cstring_makeLiteral ("\\pre");
00151     case postSym:          return cstring_makeLiteral ("\\post");
00152     case anySym:           return cstring_makeLiteral ("\\any");
00153     case sepSym:           return cstring_makeLiteral ("SEPSYM");
00154     case closeSym:         return cstring_makeLiteral ("CLOSESYM");
00155     case simpleId:         return cstring_makeLiteral ("simpleId");
00156     case LLT_TYPEDEF_NAME:     return cstring_makeLiteral ("TYPEDEF_NAME");
00157     case mapSym:           return cstring_makeLiteral ("MAPSYM");
00158     case markerSym:        return cstring_makeLiteral ("MARKERSYM");
00159     case commentSym:       return cstring_makeLiteral ("COMMENTSYM");
00160     case simpleOp:         return cstring_makeLiteral ("SIMPLEOP");
00161     case LLT_COLON:            return cstring_makeLiteral ("COLON");
00162     case LLT_COMMA:            return cstring_makeLiteral ("COMMA");
00163     case LLT_EQUALS:           return cstring_makeLiteral ("LLT_EQUALS");
00164     case LLT_LBRACE:           return cstring_makeLiteral ("LBRACE");
00165     case LLT_LBRACKET:         return cstring_makeLiteral ("LBRACKET");
00166     case LLT_LPAR:             return cstring_makeLiteral ("LPAR");
00167     case LLT_QUOTE:            return cstring_makeLiteral ("QUOTE");
00168     case LLT_RBRACE:           return cstring_makeLiteral ("RBRACE");
00169     case LLT_RBRACKET:         return cstring_makeLiteral ("RBRACKET");
00170     case LLT_RPAR:             return cstring_makeLiteral ("RPAR");
00171     case LLT_SEMI:             return cstring_makeLiteral ("SEMI");
00172     case LLT_VERTICALBAR:      return cstring_makeLiteral ("VERTICALBAR");
00173     case eqOp:             return cstring_makeLiteral ("EQOP");
00174     case LLT_MULOP:            return cstring_makeLiteral ("MULOP");
00175     case LLT_WHITESPACE:       return cstring_makeLiteral ("WHITESPACE,");
00176     case LEOFTOKEN:        return cstring_makeLiteral ("EOFTOKEN");
00177     case LLT_EOL:         return cstring_makeLiteral ("LLT_EOL");
00178     case LLT_CCHAR:            return cstring_makeLiteral ("CCHAR");
00179     case LLT_CFLOAT:           return cstring_makeLiteral ("CFLOAT");
00180     case LLT_CINTEGER:         return cstring_makeLiteral ("CINTEGER");
00181     case LLT_LCSTRING:         return cstring_makeLiteral ("CSTRING");
00182     case LLT_ALL:              return cstring_makeLiteral ("allTOKEN");
00183     case LLT_ANYTHING:         return cstring_makeLiteral ("anythingTOKEN");
00184     case LLT_BE:               return cstring_makeLiteral ("beTOKEN");
00185     case LLT_CONSTANT:         return cstring_makeLiteral ("constantTOKEN");
00186     case LLT_ELSE:         return cstring_makeLiteral ("elseTOKEN");
00187     case LLT_ENSURES:      return cstring_makeLiteral ("ensuresTOKEN");
00188     case LLT_IF:               return cstring_makeLiteral ("ifTOKEN");
00189     case LLT_IMMUTABLE:        return cstring_makeLiteral ("immutableTOKEN");
00190     case LLT_OBJ:              return cstring_makeLiteral ("objTOKEN");
00191     case LLT_IMPORTS:          return cstring_makeLiteral ("importsTOKEN");
00192     case LLT_CONSTRAINT:       return cstring_makeLiteral ("constraintTOKEN");
00193     case LLT_LET:              return cstring_makeLiteral ("letTOKEN");
00194     case LLT_MODIFIES:         return cstring_makeLiteral ("modifiesTOKEN");
00195     case LLT_CLAIMS:           return cstring_makeLiteral ("claimsTOKEN");
00196     case LLT_MUTABLE:          return cstring_makeLiteral ("mutableTOKEN");
00197     case LLT_FRESH:            return cstring_makeLiteral ("freshTOKEN");
00198     case LLT_NOTHING:          return cstring_makeLiteral ("nothingTOKEN");
00199     case LLT_PRIVATE:          return cstring_makeLiteral ("privateTOKEN");
00200     case LLT_SPEC:             return cstring_makeLiteral ("specTOKEN");
00201     case LLT_REQUIRES:         return cstring_makeLiteral ("requiresTOKEN");
00202     case LLT_BODY:             return cstring_makeLiteral ("bodyTOKEN");
00203     case LLT_RESULT:           return cstring_makeLiteral ("resultTOKEN");
00204     case LLT_SIZEOF:           return cstring_makeLiteral ("sizeofTOKEN");
00205     case LLT_THEN:             return cstring_makeLiteral ("thenTOKEN");
00206     case LLT_TYPE:             return cstring_makeLiteral ("typeTOKEN");
00207     case LLT_TYPEDEF:          return cstring_makeLiteral ("typedefTOKEN");
00208     case LLT_UNCHANGED:        return cstring_makeLiteral ("unchangedTOKEN");
00209     case LLT_USES:             return cstring_makeLiteral ("usesTOKEN");
00210     case LLT_CHAR:             return cstring_makeLiteral ("charTOKEN");
00211     case LLT_CONST:            return cstring_makeLiteral ("constTOKEN");
00212     case LLT_DOUBLE:           return cstring_makeLiteral ("doubleTOKEN");
00213     case LLT_ENUM:         return cstring_makeLiteral ("enumTOKEN");
00214     case LLT_FLOAT:            return cstring_makeLiteral ("floatTOKEN");
00215     case LLT_INT:              return cstring_makeLiteral ("intTOKEN");
00216     case LLT_LONG:             return cstring_makeLiteral ("longTOKEN");
00217     case LLT_SHORT:            return cstring_makeLiteral ("shortTOKEN");
00218     case LLT_STRUCT:           return cstring_makeLiteral ("structTOKEN");
00219     case LLT_SIGNED:       return cstring_makeLiteral ("signedTOKEN");
00220     case LLT_UNION:            return cstring_makeLiteral ("unionTOKEN");
00221     case LLT_UNKNOWN:          return cstring_makeLiteral ("unknownTOKEN");
00222     case LLT_UNSIGNED:         return cstring_makeLiteral ("unsignedTOKEN");
00223     case LLT_VOID:             return cstring_makeLiteral ("voidTOKEN");
00224     case LLT_VOLATILE:         return cstring_makeLiteral ("volatileTOKEN");
00225     case LLT_TELIPSIS:         return cstring_makeLiteral ("elipsisTOKEN");
00226     case LLT_ITER:             return cstring_makeLiteral ("iterTOKEN");
00227     case LLT_YIELD:            return cstring_makeLiteral ("yieldTOKEN");
00228     default:               return cstring_makeLiteral ("*** invalid token code ***"); 
00229     } /* end switch */
00230 }
00231 
00232 cstring ltoken_unparseCodeName (ltoken tok)
00233 {
00234   return LCLTokenCode_unparseCodeName (ltoken_getCode (tok));
00235 }
00236 
00237 /*@observer@*/ cstring ltoken_unparse (ltoken s)
00238 {
00239   if (ltoken_isValid (s))
00240     {
00241       return (lsymbol_toString (s->text));
00242     }
00243   else
00244     {
00245       return cstring_undefined;
00246     }
00247 }
00248 
00249 ltoken ltoken_copy (ltoken tok)
00250 {
00251   if (ltoken_isValid (tok))
00252     {
00253       ltoken ret = (ltoken) dmalloc (sizeof (*ret));
00254       
00255       ret->code = tok->code;
00256       ret->text = tok->text;
00257       ret->fname = tok->fname;
00258       ret->line = tok->line;
00259       ret->col = tok->col;
00260       ret->rawText = tok->rawText;
00261       ret->defined = tok->defined;
00262       ret->hasSyn = tok->hasSyn;
00263       ret->idtype = tok->idtype;
00264       ret->intfield = tok->intfield;
00265       
00266       return ret;
00267     }
00268   else
00269     {
00270       return ltoken_undefined;
00271     }
00272 }
00273 
00274 lsymbol ltoken_getRawText (ltoken tok)
00275 {
00276   if (ltoken_isValid (tok))
00277     {
00278       lsymbol ret = tok->rawText;
00279 
00280       if (lsymbol_isUndefined (ret))
00281         {
00282           ret = tok->text;
00283         }
00284       
00285       return ret;
00286     }
00287   else
00288     {
00289       return lsymbol_undefined;
00290     }
00291 }
00292 
00293 /*@only@*/ cstring ltoken_unparseLoc (ltoken t)
00294 {
00295   if (ltoken_getCode (t) != NOTTOKEN)
00296     {
00297       if (context_getFlag (FLG_SHOWCOL))
00298         {
00299           return (message ("%s:%u,%u", ltoken_fileName (t), 
00300                            ltoken_getLine (t), ltoken_getCol (t)));
00301         }
00302       else
00303         {
00304           return (message ("%s:%u", ltoken_fileName (t), ltoken_getLine (t)));
00305         }
00306     }
00307   else
00308     {
00309       return cstring_makeLiteral ("*** Not Token ***"); 
00310     }
00311 }
00312 
00313 void ltoken_markOwned (/*@owned@*/ ltoken tok)
00314 {
00315     sfreeEventually (tok);
00316 }
00317 
00318 void ltoken_free (/*@only@*/ ltoken tok)
00319 {
00320   sfree (tok); 
00321 }
00322 
00323 bool ltoken_isSingleChar (char c)
00324 {
00325   return (LCLScanCharClass (c) == SINGLECHAR);
00326 }

Generated at Fri Nov 3 18:57:43 2000 for LCLint by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000