token.h

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 259 行

H
259
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
****************************************************************************/


#include <limits.h>

#define MAX_TOKEN_SIZE          501 /* max tok size is 500 + terminating 0 */
#define MAX_PRINT_TOKEN_SIZE    (MAX_TOKEN_SIZE+10)
#define MAX_INCLUDE_NEST        20  /* #include nesting level */
#define TAB_SIZE                8

/* Tokens for used by parsers.  NOTE: If any values are modified or added,
   make sure the same is done for cparse.y and preparse.y
   NOTE: The biggest Y_xxx must not exceed 16000. */

#define BEGIN_Y_OTHER           300
#define Y_EOF                   300  /* MKS yacc will not allow it to be 0*/
#define Y_EXCLAMATION           301
#define Y_NE                    302
#define Y_POUND                 303
#define Y_POUND_POUND           304
#define Y_AND                   305
#define Y_AND_AND               306
#define Y_AND_EQUAL             307
#define Y_LEFT_PAREN            308
#define Y_RIGHT_PAREN           309
#define Y_TIMES                 310
#define Y_TIMES_EQUAL           311
#define Y_PLUS                  312
#define Y_PLUS_PLUS             313
#define Y_PLUS_EQUAL            314
#define Y_COMMA                 315
#define Y_MINUS                 316
#define Y_MINUS_MINUS           317
#define Y_MINUS_EQUAL           318
#define Y_ARROW                 319
#define Y_DOT                   320
#define Y_DOT_DOT_DOT           321
#define Y_DIVIDE                322
#define Y_DIVIDE_EQUAL          323
#define Y_COLON                 324
#define Y_SEG_OP                325
#define Y_SEMICOLON             326
#define Y_LT                    327
#define Y_LSHIFT                328
#define Y_LSHIFT_EQUAL          329
#define Y_LE                    330
#define Y_EQUAL                 331
#define Y_EQ                    332
#define Y_GT                    333
#define Y_GE                    334
#define Y_RSHIFT                335
#define Y_RSHIFT_EQUAL          336
#define Y_QUESTION              337
#define Y_LEFT_BRACKET          338
#define Y_RIGHT_BRACKET         339
#define Y_XOR                   340
#define Y_XOR_EQUAL             341
#define Y___BASED               342
#define Y___CDECL               343
#define Y___EXPORT              344
#define Y___FAR                 345
#define Y___FAR16               346
#define Y___FORTRAN             347
#define Y___HUGE                348
#define Y___INTERRUPT           349
#define Y___LOADDS              350
#define Y___NEAR                351
#define Y___PASCAL              352
#define Y___PRAGMA              353
#define Y___SAVEREGS            354
#define Y___SEGMENT             355
#define Y___SEGNAME             356
#define Y___SELF                357
#define Y___STDCALL             358
#define Y__PACKED               359
#define Y__SEG16                360
#define Y__SYSCALL              361
#define Y_AUTO                  362
#define Y_CHAR                  363
#define Y_CONST                 364
#define Y_DOUBLE                365
#define Y_ELSE                  366
#define Y_ENUM                  367
#define Y_EXTERN                368
#define Y_FLOAT                 369
#define Y_INT                   370
#define Y_LONG                  371
#define Y_REGISTER              372
#define Y_SHORT                 373
#define Y_SIGNED                374
#define Y_SIZEOF                375
#define Y_STATIC                376
#define Y_STRUCT                377
#define Y_TYPEDEF               378
#define Y_UNION                 379
#define Y_UNSIGNED              380
#define Y_VOID                  381
#define Y_VOLATILE              382
#define Y_LEFT_BRACE            383
#define Y_OR                    384
#define Y_OR_EQUAL              385
#define Y_OR_OR                 386
#define Y_RIGHT_BRACE           387
#define Y_TILDE                 388
#define Y_ID                    389
#define Y_STRING                390
#define Y_INCLUDE_FILE_NAME     391
#define Y_TYPEDEF_NAME          392
#define Y_NUMBER                393
#define Y_PERCENT               394
#define Y_PERCENT_EQUAL         395
#define Y_DEFINED               396
#define END_Y_OTHER             396

#define BEGIN_Y_PREPROCESSOR    500
#define Y_PRE_COMMENT           500
#define Y_PRE_NULL              501  /* # followed by newline */
#define Y_PRE_NEWLINE           502
#define Y_PRE_DEFINE            503
#define Y_PRE_ELIF              504
#define Y_PRE_ELSE              505
#define Y_PRE_ENDIF             506
#define Y_PRE_ERROR             507
#define Y_PRE_IF                508
#define Y_PRE_IFDEF             509
#define Y_PRE_IFNDEF            510
#define Y_PRE_INCLUDE           511
#define Y_PRE_LINE              512
#define Y_PRE_PRAGMA            513
#define Y_PRE_UNDEF             514
#define Y_PRE_SPECIAL_LEFT_PAREN 515
#define END_Y_PREPROCESSOR      515

typedef enum {
    CONSTT_CHAR_CONST,
    CONSTT_INT_CONST,
    CONSTT_UINT_CONST,
    CONSTT_LONG_CONST,
    CONSTT_ULONG_CONST,
    CONSTT_FLOAT_CONST,
    CONSTT_DOUBLE_CONST,
    CONSTT_LDOUBLE_CONST,   /* Long double const */
    CONSTT_STRING_CONST,
    CONSTT_MAX
} ConstType;

typedef enum {
    TT_PREPROCESSOR,
    TT_OTHER
} TokenType;

/* Tokenizer states */
typedef enum {
    TS_START,
    TS_COMMENT
} TStates;

#define MAX_LINE_NUM    SHRT_MAX
#define MAX_COL_NUM     SHRT_MAX
typedef struct {
    char *fileName;
    int8 fileLevel;
    int16 lineNum;
    int16  colNum;
    uint8  linesBefore;
    uint8  spacesBefore;

    long orderLineNum;

} TokPos, *pTokPos;

typedef enum {
    RADT_DECIMAL,
    RADT_HEX,
    RADT_OCTAL,
    RADT_MAX
} RadixType;


typedef struct {
    uint16 code;
    union {
        struct {      // General info
            char* string;
            pDeclInfo pTypeDecl;  // This only points to a symbol table entry
        };
        struct {
            ConstType type: 6;
            RadixType radix: 2;
            union {
                unsigned long lIntConst;
                long double lDoubleConst;
                long double data;
            } repr;
        } constant;
        struct {
            char *s;
            int strLen;
        } s;  // String representation
    } repr;
} *pTokData;

typedef struct {
    pTokData data;
    pTokPos pos;
} *pToken;

char* initTokenizer(char *fname);
void zapTokenizer(void);
char* pushTokFile(char *fname);
int popTokFile(void);
WicErrors getNextToken(pToken tok);
TokenType getTokDataType(pTokData tokData);

pToken createToken(pTokData data, pTokPos pos);
pTokPos createTokPos(void);
pTokData createTokData(void);
pToken createEnumNumToken(unsigned long num);
pToken createPLUSToken(void);
pToken createEQUALToken(void);
pToken createIDTokenAfter(char *str, pTokPos newPos);
pToken createCommentToken(char *str, pTokPos pos);
pTokPos combine2TokPos(pTokPos p1, pTokPos p2);
pToken combine2Token(pToken t1, pToken t2);
void setTokPos(pTokPos pos, char *fileName, int8 fileLevel, int16 lineNum,
    int16  colNum, uint8  linesBefore, uint8  spacesBefore, long orderLineNum);

char *getTokDataIdName(pTokData data);
char *getTokenIdName(pToken tok);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?