X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fscanner.h;h=b98170697c51f7d564b2259499554213ed4f7906;hb=c76a8657b3324a7ce203665bbdc720a4f706bf48;hp=55c37de5cd5ff24dd9543630b8863d84dab409da;hpb=1b4039be3be867c152ddc00290f18ef4ce6469db;p=cc65 diff --git a/src/cc65/scanner.h b/src/cc65/scanner.h index 55c37de5c..b98170697 100644 --- a/src/cc65/scanner.h +++ b/src/cc65/scanner.h @@ -1,8 +1,35 @@ -/* - * scanner.h - * - * Ullrich von Bassewitz, 07.06.1998 - */ +/*****************************************************************************/ +/* */ +/* scanner.h */ +/* */ +/* Source file line info structure */ +/* */ +/* */ +/* */ +/* (C) 1998-2004 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ @@ -11,32 +38,47 @@ +/* cc65 */ #include "datatype.h" #include "ident.h" +#include "lineinfo.h" /*****************************************************************************/ -/* Token definitions */ +/* Token definitions */ /*****************************************************************************/ typedef enum token_t { + TOK_INVALID, TOK_CEOF, - TOK_AUTO, + /* Storage specifiers */ + TOK_FIRST_STORAGE_CLASS, + TOK_AUTO = TOK_FIRST_STORAGE_CLASS, TOK_EXTERN, TOK_REGISTER, TOK_STATIC, TOK_TYPEDEF, - TOK_ENUM, - TOK_CONST, + TOK_LAST_STORAGE_CLASS = TOK_TYPEDEF, + + /* Tokens denoting type qualifiers */ + TOK_FIRST_TYPEQUAL, + TOK_CONST = TOK_FIRST_TYPEQUAL, TOK_VOLATILE, + TOK_RESTRICT, + TOK_LAST_TYPEQUAL = TOK_RESTRICT, + + /* Function specifiers */ + TOK_INLINE, + TOK_FASTCALL, /* Tokens denoting types */ - TOK_FIRSTTYPE, - TOK_CHAR = TOK_FIRSTTYPE, + TOK_FIRST_TYPE, + TOK_ENUM = TOK_FIRST_TYPE, + TOK_CHAR, TOK_INT, TOK_DOUBLE, TOK_FLOAT, @@ -47,7 +89,7 @@ typedef enum token_t { TOK_STRUCT, TOK_UNION, TOK_VOID, - TOK_LASTTYPE = TOK_VOID, + TOK_LAST_TYPE = TOK_VOID, /* Control statements */ TOK_DO, @@ -127,7 +169,7 @@ typedef enum token_t { TOK_ATTRIBUTE, TOK_FAR, - TOK_FASTCALL, + TOK_NEAR, TOK_A, TOK_X, TOK_Y, @@ -146,77 +188,108 @@ typedef enum token_t { /* Token stuff */ -typedef struct Token_ Token; -struct Token_ { - token_t Tok; /* The token itself */ - long IVal; /* The integer attribute */ - double FVal; /* The float attribute */ - ident Ident; /* Identifier if IDENT */ - unsigned Pos; /* Source line where the token comes from */ - type* Type; /* Type if integer or float constant */ +typedef struct Token Token; +struct Token { + token_t Tok; /* The token itself */ + long IVal; /* The integer attribute */ + double FVal; /* The float attribute */ + ident Ident; /* Identifier if IDENT */ + LineInfo* LI; /* Source line where the token comes from */ + Type* Type; /* Type if integer or float constant */ }; extern Token CurTok; /* The current token */ extern Token NextTok; /* The next token */ -/* Defines to make the old code work */ -#define curtok CurTok.Tok -#define curval CurTok.IVal -#define curpos CurTok.Pos -#define curtype CurTok.Type - -#define nxttok NextTok.Tok -#define nxtval NextTok.IVal -#define nxtpos NextTok.Pos -#define nxttype NextTok.Type - /*****************************************************************************/ -/* code */ +/* code */ /*****************************************************************************/ -void SymName (char* s); -/* Get symbol from input stream */ +#if defined(HAVE_INLINE) +INLINE int TokIsStorageClass (const Token* T) +/* Return true if the token is a storage class specifier */ +{ + return (T->Tok >= TOK_FIRST_STORAGE_CLASS && T->Tok <= TOK_LAST_STORAGE_CLASS); +} +#else +# define TokIsStorageClass(T) \ + ((T)->Tok >= TOK_FIRST_STORAGE_CLASS && (T)->Tok <= TOK_LAST_STORAGE_CLASS) +#endif -int IsSym (char* s); -/* Get symbol from input stream or return 0 if not a symbol. */ +#if defined(HAVE_INLINE) +INLINE int TokIsType (const Token* T) +/* Return true if the token is a type */ +{ + return (T->Tok >= TOK_FIRST_TYPE && T->Tok <= TOK_LAST_TYPE); +} +#else +# define TokIsType(T) ((T)->Tok >= TOK_FIRST_TYPE && (T)->Tok <= TOK_LAST_TYPE) +#endif + +#if defined(HAVE_INLINE) +INLINE int TokIsTypeQual (const Token* T) +/* Return true if the token is a type qualifier */ +{ + return (T->Tok >= TOK_FIRST_TYPEQUAL && T->Tok <= TOK_LAST_TYPEQUAL); +} +#else +# define TokIsTypeQual(T) ((T)->Tok >= TOK_FIRST_TYPEQUAL && (T)->Tok <= TOK_LAST_TYPEQUAL) +#endif + +int TokIsFuncSpec (const Token* T); +/* Return true if the token is a function specifier */ + +void SymName (char* S); +/* Read a symbol from the input stream. The first character must have been + * checked before calling this function. The buffer is expected to be at + * least of size MAX_IDENTLEN+1. + */ + +int IsSym (char* S); +/* If a symbol follows, read it and return 1, otherwise return 0 */ void NextToken (void); /* Get next token from input stream */ -void Consume (token_t Token, unsigned ErrNum); +void SkipTokens (const token_t* TokenList, unsigned TokenCount); +/* Skip tokens until we reach TOK_CEOF or a token in the given token list. + * This routine is used for error recovery. + */ + +int Consume (token_t Token, const char* ErrorMsg); /* Eat token if it is the next in the input stream, otherwise print an error - * message. + * message. Returns true if the token was found and false otherwise. */ -void ConsumeColon (void); +int ConsumeColon (void); /* Check for a colon and skip it. */ -void ConsumeSemi (void); +int ConsumeSemi (void); /* Check for a semicolon and skip it. */ -void ConsumeComma (void); +int ConsumeComma (void); /* Check for a comma and skip it. */ -void ConsumeLParen (void); +int ConsumeLParen (void); /* Check for a left parenthesis and skip it */ -void ConsumeRParen (void); +int ConsumeRParen (void); /* Check for a right parenthesis and skip it */ -void ConsumeLBrack (void); +int ConsumeLBrack (void); /* Check for a left bracket and skip it */ -void ConsumeRBrack (void); +int ConsumeRBrack (void); /* Check for a right bracket and skip it */ -void ConsumeLCurly (void); +int ConsumeLCurly (void); /* Check for a left curly brace and skip it */ -void ConsumeRCurly (void); +int ConsumeRCurly (void); /* Check for a right curly brace and skip it */