00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
00036
00037
00038
00039
00040
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
00073
00074 static 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
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 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 }
00230 }
00231
00232 cstring ltoken_unparseCodeName (ltoken tok)
00233 {
00234 return LCLTokenCode_unparseCodeName (ltoken_getCode (tok));
00235 }
00236
00237 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 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 ( ltoken tok)
00314 {
00315 sfreeEventually (tok);
00316 }
00317
00318 void ltoken_free ( ltoken tok)
00319 {
00320 sfree (tok);
00321 }
00322
00323 bool ltoken_isSingleChar (char c)
00324 {
00325 return (LCLScanCharClass (c) == SINGLECHAR);
00326 }