/*
** Splint - annotation-assisted static program checker
** Copyright (C) 1994-2003 University of Virginia,
** Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the
** Free Software Foundation; either version 2 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but
** WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** General Public License for more details.
**
** The GNU General Public License is available from http://www.gnu.org/ or
** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
** MA 02111-1307, USA.
**
** For information on splint: info@splint.org
** To report a bug: splint-bug@splint.org
** For more information: http://www.splint.org
*/
/*
** ltoken.c
*/
# include "splintMacros.nf"
# include "basic.h"
# include "llgrammar.h"
# include "scanline.h"
# include "lclscanline.h"
/*
** Place to store the \keyword (\forall ...) tokens. These tokens will
** have to be modified when the extensionChar ("\") changes.
** set in LCLScanLineInit of lclscanline.c or in scanline.c
*/
/*@-namechecks@*/ /* These should all start with g_ */
ltoken ltoken_forall;
ltoken ltoken_exists;
ltoken ltoken_true;
ltoken ltoken_false;
ltoken ltoken_not;
ltoken ltoken_and;
ltoken ltoken_or;
ltoken ltoken_implies;
ltoken ltoken_eq;
ltoken ltoken_neq;
ltoken ltoken_equals;
ltoken ltoken_eqsep;
ltoken ltoken_select;
ltoken ltoken_open;
ltoken ltoken_sep;
ltoken ltoken_close;
ltoken ltoken_id;
ltoken ltoken_arrow;
ltoken ltoken_marker;
ltoken ltoken_pre;
ltoken ltoken_post;
ltoken ltoken_comment;
ltoken ltoken_any;
ltoken ltoken_compose;
ltoken ltoken_if;
ltoken ltoken_result;
ltoken ltoken_typename;
ltoken ltoken_bool;
ltoken ltoken_farrow;
ltoken ltoken_lbracked;
ltoken ltoken_rbracket;
/*@=namechecks@*/
static /*@notnull@*/ ltoken ltoken_new (void)
{
ltoken tok = (ltoken) dmalloc (sizeof (*tok));
tok->code = NOTTOKEN;
tok->col = 0;
tok->line = 0;
tok->text = lsymbol_undefined;
tok->fname = lsymbol_undefined;
tok->rawText = lsymbol_undefined;
tok->defined = FALSE;
tok->hasSyn = FALSE;
return tok;
}
ltoken ltoken_create (ltokenCode code, lsymbol text)
{
ltoken tok = ltoken_new ();
tok->code = code;
tok->text = text;
return tok;
}
ltoken ltoken_createRaw (ltokenCode code, lsymbol text)
{
ltoken tok = ltoken_new ();
tok->code = code;
tok->rawText = text;
return tok;
}
ltoken ltoken_createType (ltokenCode code, SimpleIdCode idtype, lsymbol text)
{
ltoken tok = ltoken_new ();
/* no...what's the real llassert (code == simpleId); */
tok->code = code;
tok->idtype = idtype;
tok->text = text;
return tok;
}
ltoken ltoken_createFull (ltokenCode code, lsymbol text,
cstring file, int line,
int col)
{
ltoken tok = (ltoken) dmalloc (sizeof (*tok));
tok->code = code;
tok->text = text;
tok->fname = lsymbol_fromString (file);
tok->line = line;
tok->col = col;
tok->rawText = lsymbol_undefined;
tok->defined = FALSE;
tok->hasSyn = FALSE;
return tok;
}
static /*@only@*/ cstring LCLTokenCode_unparseCodeName (ltokenCode t)
{
switch (t)
{
case NOTTOKEN: return cstring_makeLiteral ("*** NOTTOKEN ***");
case quantifierSym: return cstring_makeLiteral ("QUANTIFIERSYM");
case logicalOp: return cstring_makeLiteral ("LOGICALOP");
case selectSym: return cstring_makeLiteral ("SELECTSYM");
case openSym: return cstring_makeLiteral ("OPENSYM");
case preSym: return cstring_makeLiteral ("\\pre");
case postSym: return cstring_makeLiteral ("\\post");
case anySym: return cstring_makeLiteral ("\\any");
case sepSym: return cstring_makeLiteral ("SEPSYM");
case closeSym: return cstring_makeLiteral ("CLOSESYM");
case simpleId: return cstring_makeLiteral ("simpleId");
case LLT_TYPEDEF_NAME: return cstring_makeLiteral ("TYPEDEF_NAME");
case mapSym: return cstring_makeLiteral ("MAPSYM");
case markerSym: return cstring_makeLiteral ("MARKERSYM");
case commentSym: return cstring_makeLiteral ("COMMENTSYM");
case simpleOp: return cstring_makeLiteral ("SIMPLEOP");
case LLT_COLON: return cstring_makeLiteral ("COLON");
case LLT_COMMA: return cstring_makeLiteral ("COMMA");
case LLT_EQUALS: return cstring_makeLiteral ("LLT_EQUALS");
case LLT_LBRACE: return cstring_makeLiteral ("LBRACE");
case LLT_LBRACKET: return cstring_makeLiteral ("LBRACKET");
case LLT_LPAR: return cstring_makeLiteral ("LPAR");
case LLT_QUOTE: return cstring_makeLiteral ("QUOTE");
case LLT_RBRACE: return cstring_makeLiteral ("RBRACE");
case LLT_RBRACKET: return cstring_makeLiteral ("RBRACKET");
case LLT_RPAR: return cstring_makeLiteral ("RPAR");
case LLT_SEMI: return cstring_makeLiteral ("SEMI");
case LLT_VERTICALBAR: return cstring_makeLiteral ("VERTICALBAR");
case eqOp: return cstring_makeLiteral ("EQOP");
case LLT_MULOP: return cstring_makeLiteral ("MULOP");
case LLT_WHITESPACE: return cstring_makeLiteral ("WHITESPACE,");
case LEOFTOKEN: return cstring_makeLiteral ("EOFTOKEN");
case LLT_EOL: return cstring_makeLiteral ("LLT_EOL");
case LLT_CCHAR: return cstring_makeLiteral ("CCHAR");
case LLT_CFLOAT: return cstring_makeLiteral ("CFLOAT");
case LLT_CINTEGER: return cstring_makeLiteral ("CINTEGER");
case LLT_LCSTRING: return cstring_makeLiteral ("CSTRING");
case LLT_ALL: return cstring_makeLiteral ("allTOKEN");
case LLT_ANYTHING: return cstring_makeLiteral ("anythingTOKEN");
case LLT_BE: return cstring_makeLiteral ("beTOKEN");
case LLT_CONSTANT: return cstring_makeLiteral ("constantTOKEN");
case LLT_ELSE: return cstring_makeLiteral ("elseTOKEN");
case LLT_ENSURES: return cstring_makeLiteral ("ensuresTOKEN");
case LLT_IF: return cstring_makeLiteral ("ifTOKEN");
case LLT_IMMUTABLE: return cstring_makeLiteral ("immutableTOKEN");
case LLT_OBJ: return cstring_makeLiteral ("objTOKEN");
case LLT_IMPORTS: return cstring_makeLiteral ("importsTOKEN");
case LLT_CONSTRAINT: return cstring_makeLiteral ("constraintTOKEN");
case LLT_LET: return cstring_makeLiteral ("letTOKEN");
case LLT_MODIFIES: return cstring_makeLiteral ("modifiesTOKEN");
case LLT_CLAIMS: return cstring_makeLiteral ("claimsTOKEN");
case LLT_MUTABLE: return cstring_makeLiteral ("mutableTOKEN");
case LLT_FRESH: return cstring_makeLiteral ("freshTOKEN");
case LLT_NOTHING: return cstring_makeLiteral ("nothingTOKEN");
case LLT_PRIVATE: return cstring_makeLiteral ("privateTOKEN");
case LLT_SPEC: return cstring_makeLiteral ("specTOKEN");
case LLT_REQUIRES: return cstring_makeLiteral ("requiresTOKEN");
case LLT_BODY: return cstring_makeLiteral ("bodyTOKEN");
case LLT_RESULT: return cstring_makeLiteral ("resultTOKEN");
case LLT_SIZEOF: return cstring_makeLiteral ("sizeofTOKEN");
case LLT_THEN: return cstring_makeLiteral ("thenTOKEN");
case LLT_TYPE: return cstring_makeLiteral ("typeTOKEN");
case LLT_TYPEDEF: return cstring_makeLiteral ("typedefTOKEN");
case LLT_UNCHANGED: return cstring_makeLiteral ("unchangedTOKEN");
case LLT_USES: return cstring_makeLiteral ("usesTOKEN");
case LLT_CHAR: return cstring_makeLiteral ("charTOKEN");
case LLT_CONST: return cstring_makeLiteral ("constTOKEN");
case LLT_DOUBLE: return cstring_makeLiteral ("doubleTOKEN");
case LLT_ENUM: return cstring_makeLiteral ("enumTOKEN");
case LLT_FLOAT: return cstring_makeLiteral ("floatTOKEN");
case LLT_INT: return cstring_makeLiteral ("intTOKEN");
case LLT_LONG: return cstring_makeLiteral ("longTOKEN");
case LLT_SHORT: return cstring_makeLiteral ("shortTOKEN");
case LLT_STRUCT: return cstring_makeLiteral ("structTOKEN");
case LLT_SIGNED: return cstring_makeLiteral ("signedTOKEN");
case LLT_UNION: return cstring_makeLiteral ("unionTOKEN");
case LLT_UNKNOWN: return cstring_makeLiteral ("unknownTOKEN");
case LLT_UNSIGNED: return cstring_makeLiteral ("unsignedTOKEN");
case LLT_VOID: return cstring_makeLiteral ("voidTOKEN");
case LLT_VOLATILE: return cstring_makeLiteral ("volatileTOKEN");
case LLT_TELIPSIS: return cstring_makeLiteral ("elipsisTOKEN");
case LLT_ITER: return cstring_makeLiteral ("iterTOKEN");
case LLT_YIELD: return cstring_makeLiteral ("yieldTOKEN");
default: return cstring_makeLiteral ("*** invalid token code ***");
} /* end switch */
}
cstring ltoken_unparseCodeName (ltoken tok)
{
return LCLTokenCode_unparseCodeName (ltoken_getCode (tok));
}
/*@observer@*/ cstring ltoken_unparse (ltoken s)
{
if (ltoken_isValid (s))
{
return (lsymbol_toString (s->text));
}
else
{
return cstring_undefined;
}
}
ltoken ltoken_copy (ltoken tok)
{
if (ltoken_isValid (tok))
{
ltoken ret = (ltoken) dmalloc (sizeof (*ret));
ret->code = tok->code;
ret->text = tok->text;
ret->fname = tok->fname;
ret->line = tok->line;
ret->col = tok->col;
ret->rawText = tok->rawText;
ret->defined = tok->defined;
ret->hasSyn = tok->hasSyn;
ret->idtype = tok->idtype;
ret->intfield = tok->intfield;
return ret;
}
else
{
return ltoken_undefined;
}
}
lsymbol ltoken_getRawText (ltoken tok)
{
if (ltoken_isValid (tok))
{
lsymbol ret = tok->rawText;
if (lsymbol_isUndefined (ret))
{
ret = tok->text;
}
return ret;
}
else
{
return lsymbol_undefined;
}
}
/*@only@*/ cstring ltoken_unparseLoc (ltoken t)
{
if (ltoken_getCode (t) != NOTTOKEN)
{
cstring res = fileloc_unparseRawCol (ltoken_fileName (t),
ltoken_getLine (t),
ltoken_getCol (t));
return res;
}
else
{
return cstring_makeLiteral ("*** Not Token ***");
}
}
void ltoken_markOwned (/*@owned@*/ ltoken tok)
{
sfreeEventually (tok);
}
void ltoken_free (/*@only@*/ ltoken tok)
{
sfree (tok);
}
bool ltoken_isSingleChar (char c)
{
return (LCLScanCharClass (c) == SINGLECHAR);
}
syntax highlighted by Code2HTML, v. 0.9.1