]> git.sur5r.net Git - cc65/blobdiff - src/cc65/scanner.h
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / src / cc65 / scanner.h
index af424af9739fc3c8c6402aee79fd1e8150448801..77f2028b9e7b28535fa06a06cad23506e16a7f6b 100644 (file)
@@ -1,8 +1,35 @@
-/*
- * scanner.h
- *
- * Ullrich von Bassewitz, 07.06.1998
- */
+/*****************************************************************************/
+/*                                                                           */
+/*                                 scanner.h                                 */
+/*                                                                           */
+/*                      Source file line info structure                      */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 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.                                                          */
+/*                                                                           */
+/*****************************************************************************/
 
 
 
 
 
 
+/* common */
+#include "fp.h"
+
+/* 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,
+    TOK_CDECL,
 
     /* 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 +93,7 @@ typedef enum token_t {
     TOK_STRUCT,
     TOK_UNION,
     TOK_VOID,
-    TOK_LASTTYPE       = TOK_VOID,
+    TOK_LAST_TYPE       = TOK_VOID,
 
     /* Control statements */
     TOK_DO,
@@ -89,7 +135,7 @@ typedef enum token_t {
     TOK_MINUS,
     TOK_MUL_ASSIGN,
     TOK_STAR,
-    TOK_MUL = TOK_STAR,                /* Alias */
+    TOK_MUL = TOK_STAR,         /* Alias */
     TOK_DIV_ASSIGN,
     TOK_DIV,
     TOK_BOOL_AND,
@@ -124,10 +170,11 @@ typedef enum token_t {
     TOK_ICONST,
     TOK_CCONST,
     TOK_FCONST,
+    TOK_WCSCONST,
 
     TOK_ATTRIBUTE,
     TOK_FAR,
-    TOK_FASTCALL,
+    TOK_NEAR,
     TOK_A,
     TOK_X,
     TOK_Y,
@@ -140,83 +187,118 @@ typedef enum token_t {
 
 
 /*****************************************************************************/
-/*                                  data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
 
+/* Forward for struct Literal */
+struct Literal;
+
 /* 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 */
+    struct Literal* SVal;       /* String literal is any */
+    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
+extern Token CurTok;            /* The current token */
+extern Token NextTok;           /* The next token */
 
 
 
 /*****************************************************************************/
-/*                                  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
+
+#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 IsSym (char* s);
-/* Get symbol from input stream or return 0 if not a symbol. */
+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, const char* ErrorMsg);
+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 */