ctree.h

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

H
407
字号
/****************************************************************************
*
*                            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!
*
****************************************************************************/


typedef enum {
    LABT_LIST,
    LABT_TOKEN,
    LABT_CONSTRUCT_ROOT,
    LABT_DECL_INFO,
    LABT_DECL_LIST
} LabelType;

typedef enum {
    LABCT_ADDR_OF_VALUE,
    LABCT_AND,
    LABCT_AND_AND,
    LABCT_ARROW,
    LABCT_CALL,
    LABCT_CAST_EXPR,
    LABCT_COLON,
    LABCT_DEFINED,
    LABCT_DIVIDE,
    LABCT_DOT,
    LABCT_EQ,
    LABCT_EXCLAMATION,
    LABCT_EXPR_LIST,
    LABCT_EXPR_SEPARATOR,
    LABCT_GE,
    LABCT_GT,
    LABCT_INDEX,
    LABCT_LE,
    LABCT_LSHIFT,
    LABCT_LT,
    LABCT_MINUS,
    LABCT_NE,
    LABCT_OR,
    LABCT_OR_OR,
    LABCT_PAREN_EXPR,
    LABCT_PERCENT,
    LABCT_PLUS,
    LABCT_PRE_DEFINE_MACRO,
    LABCT_PRE_ELIF,
    LABCT_PRE_ELSE,
    LABCT_PRE_ENDIF,
    LABCT_PRE_IF,
    LABCT_PRE_IFDEF,
    LABCT_PRE_IFNDEF,
    LABCT_PRE_INCLUDE,
    LABCT_PRE_DIR_LIST,
    LABCT_QUESTION,
    LABCT_RSHIFT,
    LABCT_SIZEOF_EXPR,
    LABCT_SIZEOF_TYPE,
    LABCT_STRINGS,
    LABCT_TILDE,
    LABCT_TIMES,
    LABCT_UNARY_MINUS,
    LABCT_UNARY_PLUS,
    LABCT_VALUE_AT_ADDR,
    LABCT_XOR,

    LABCT_MAX
} LabelConstrType;

typedef struct {
    LabelType type;
    union {
        struct { /* Construct in case type=LABT_CONSTRUCT_ROOT*/
            LabelConstrType type: 8;
            int8 numTokens;
            pToken *tokens;
        } constr;
        pSLList list; // List of tokens
        pToken token;
        pDeclInfo dinfo;
        pDeclList declList;
        void *data;
    } repr;
} Label, *pLabel;

pLabel createConstr0Label(LabelConstrType type);
pLabel createConstr1Label(LabelConstrType type, pToken t0);
pLabel createConstr2Label(LabelConstrType type, pToken t0, pToken t1);
pLabel createConstr3Label(LabelConstrType type, pToken t0, pToken t1,
                          pToken t2);
pLabel createConstr4Label(LabelConstrType type, pToken t0, pToken t1,
                          pToken t2, pToken t3);
pLabel createTokenLabel(pToken token);
pLabel createListLabel(pSLList list);
pLabel createDeclInfoLabel(pDeclInfo dinfo);
pLabel createDeclListLabel(pDeclList declList);

typedef struct _CTree {
    pLabel label;
    struct _CTree *child1; /* Left child */
    struct _CTree *child2;  /* Right child */
} CTree, *pCTree;

pCTree createCTreeRoot(pLabel label); /* Create a single node */
pCTree createNULLCTree(void);
pCTree createCTree1(pLabel label, pCTree child); /* Create Unary tree */
pCTree createCTree2(pLabel label, pCTree child1, pCTree child2); /* Create binary tree */
pLabel getCTreeLabel(pCTree tree);
pLabel getCTreeChild1Label(pCTree tree);
pLabel getCTreeChild2Label(pCTree tree);
pCTree getCTreeChild1(pCTree tree);
pCTree getCTreeChild2(pCTree tree);

void deleteLabel(pLabel label);
void deleteCTree(pCTree tree);

void printCTree(pCTree tree);


typedef union {
    pOUnit oUnit;
    pToken token;
    pCTree tree;
    pLabel label;
    pSLList tokenList;
    pDeclInfo dinfo;
    pDeclTree declList;
    pDeclTreeElem declTreeElem;
    pDeclStructInfo dsinfo;
    pDeclStructBody dsbody;
    pEnumList enumList;
    pEnumElem enumElem;
    pDeclEnum declEnum;
    pDclr dclr;
    pDclrList dclrList;
    pDclrPtr dclrPtr;
    pArrElem arrElem;
    int flag;

    void* data;
} ParseUnion;
//=========================================================================
// Declaration Information
//=========================================================================

/* types used for collecting decl-specifiers */

/* only one of these may be specified */
typedef enum {
    STG_NULL            = 0,
    STG_TYPEDEF,
    STG_REGISTER,
    STG_AUTO,
    STG_EXTERN,
    STG_STATIC,
    STG_MAX
} StgClass;

/* any one of these may be specified */
typedef enum {
    STY_CONST           = 0x01,
    STY_VOLATILE        = 0x02,
    STY_NULL            = 0x00
} TypeQualifier;

/* only certain combinations may be specified */
typedef enum {
    STM_NULL            = 0x0000,
    STM_CHAR            = 0x0001,
    STM_INT             = 0x0002,
    STM_LONG            = 0x0004,
    STM_FLOAT           = 0x0008,
    STM_DOUBLE          = 0x0010,
    STM_SIGNED          = 0x0020,
    STM_UNSIGNED        = 0x0040,
    STM_SHORT           = 0x0080,
    STM_VOID            = 0x0100,
    STM_DOT_DOT_DOT     = 0x0200      // Used exclusively for function args
} YScalarType;

typedef enum {
    DIT_NULL            = 0,
    DIT_SCALAR,                 // Things like int, uint and alike
    DIT_STRUCT_OR_UNION,
    DIT_ENUM
} DeclInfoType;

// Scalar types
typedef enum {
    SCL_NULL            = 0x00,
    SCL_CHAR,
    SCL_SCHAR,
    SCL_UCHAR,
    SCL_WCHAR,            // extension: long char
    SCL_SSHORT,
    SCL_USHORT,
    SCL_SINT,
    SCL_UINT,
    SCL_SLONG,
    SCL_ULONG,
    SCL_FLOAT,
    SCL_DOUBLE,
    SCL_LDOUBLE,        // long double
    SCL_VOID,
    SCL_DOT_DOT_DOT,
    SCL_MAX
} ScalarType;

typedef enum {
    MT_NULL = 0,
    MT_NEAR,
    MT_FAR,
    MT_FAR16,
    MT_HUGE,
    MT_MAX
} MemType;

pDclrList createDclrList(pDclr dclr);
pDclrList addDclrList(pDclrList list, pDclr elem);

struct DeclInfo {
    pToken begPunct;  // Punctuation mark at the beginning of a declarator
    StgClass storage;
    TypeQualifier qualifier;

    pTokPos prefixPos;

    DeclInfoType type: 8;
    union {
        struct {        // DIT_SCALAR
            YScalarType scalarCombo;
            ScalarType scalar;
            pTokPos scalarPos;
        } scalar;

        pDeclEnum e;                    // DIT_ENUM

        pDeclStructInfo s;              // DIT_STRUCT_OR_UNION
    } repr;
    pDclrList dclrList;  // List of declarators (optional)
    pDclr dclr;  // Declarator that may come from defined type
};

int   isExternDecl(pDeclInfo decl);

pDeclList createDeclList(pDeclInfo elem);
pDeclList addDeclList(pDeclList list, pDeclInfo elem);

pDeclInfo createDeclInfoENUM(pDeclEnum e);
pDeclInfo createDeclInfoSTRUCT(pDeclStructInfo s);
pDeclInfo createDeclInfoSCALAR(YScalarType tokCode, pTokPos pos);
void initNoTypeDecl(pDeclInfo decl);
pDeclInfo createStgClassDeclInfo(StgClass stgClass, pToken pos);
pDeclInfo createQualifierDeclInfo(TypeQualifier qualifier, pTokPos pos);
pDeclInfo combine2DeclInfo(pDeclInfo d1, pDeclInfo d2);
pDeclInfo addDeclInfoDclrList(pDeclInfo decl, pDclrList list);
pDeclInfo setDeclDclr(pDeclInfo decl, pDclr dclr);
pDeclInfo addDeclDclr(pDeclInfo decl, pDclr dclr);
pDeclInfo addDeclPunct(pDeclInfo decl, pToken begPunct);

typedef enum {
    DSIT_STRUCT,
    DSIT_UNION
} DeclStructInfoType;

struct DeclStructInfo {
    DeclStructInfoType type;
    pTokPos typePos;
    pToken name;                // Name (optional) of the structure
    pDeclStructBody body;       // Body (optional) of the structure
};
pDeclStructInfo createDeclStructInfo(pToken typeTok,
                                     pToken name, pDeclStructBody body);

struct DeclStructBody {
    pDeclList declList;
    pTokPos endPos;
};

pDeclStructBody createDeclStructBody(pDeclList list, pTokPos endPos);

struct ArrElem {
    pToken lBracket;
    pCTree constExpr;
    pToken rBracket;
};

struct Dclr {
    MemType memType;
    pTokPos memPos;

    pToken pragmaMod;

    pDclrPtr ptr;

    pToken id;

    pArrList arrList;

    pToken argBegin;  // '('
    pDeclList args;
    pToken argEnd;  // ')'

    pToken equalTok;
    pCTree initializer;
};

pDclr createDclr(pToken id);
int   isDclrPtr(pDclr dclr);  // Returns true iff dclr is a pointer
int   isDclrFunc(pDclr dclr); // Returns true iff dclr is a function
char *getDclrName(pDclr dclr);
pDclr addDclrPragmaModifier(pDclr dclr, pToken pragmaTok);
pDclr addDclrMemModifier(pDclr dclr, pToken memTok);
pDclr addDclrPtrModifier(pDclr dclr, pDclrPtr ptr);
pDclr addDclrArray(pDclr dclr, pToken begin, pCTree constExpr, pToken end);
pDclr addDclrFuncArgs(pDclr dclr, pToken lParen, pDeclList args, pToken rParen);
pDclr addDclrInitializer(pDclr dclr, pToken equalTok, pCTree initializer);
pDclr combine2Dclr(pDclr dclr1, pDclr dclr2);

struct DclrPtr {
    MemType memType;
    TypeQualifier qualifiers;
    pTokPos pos;
};
pDclrPtr createDclrPtr(pToken yTimes, TypeQualifier qualifiers);

/*--------*/

struct DeclEnum {
    pTokPos enumPos;            // enum
//    pToken name;              // optional
    pEnumList list;             // optional
};
pDeclEnum createDeclEnum(pToken enumPos, pEnumList list);

pEnumList createEnumList(pEnumElem elem);
pEnumList addEnumList(pEnumList list,  pEnumElem elem);
pEnumList finishEnumListCreation(pEnumList list);

struct EnumElem {
    char   begPunctExists;  // comma exists before this element
    pToken name;
    pToken equal;
    pCTree expression;
};

pEnumElem createEnumElem(pToken name, pToken equal, pCTree expression);
pCTree createEnumFromDefine(pToken defTok, pToken id, pCTree expr);
pEnumElem addEnumElemBegPunct(pEnumElem elem);

/*--------*/

void logMessage(char *str);

/*----------- Duplicate functions -------------*/
pCTree dupCTree(pCTree elem, pTokPos pos);
pLabel dupLabel(pLabel elem, pTokPos pos);
pDeclInfo dupDeclInfo(pDeclInfo elem, pTokPos pos);
pDclr dupDclr(pDclr elem, pTokPos pos);
pDeclStructInfo dupDeclStructInfo(pDeclStructInfo elem, pTokPos pos);
pDeclStructBody dupDeclStructBody(pDeclStructBody elem, pTokPos pos);
pArrElem dupArrElem(pArrElem elem, pTokPos pos);
pDclrPtr dupDclrPtr(pDclrPtr elem, pTokPos pos);
pDeclEnum dupDeclEnum(pDeclEnum elem, pTokPos pos);
pEnumElem dupEnumElem(pEnumElem, pTokPos pos);
pToken dupToken(pToken elem, pTokPos pos);
pTokPos dupTokPos(pTokPos elem, pTokPos pos);

/*---------------- Zap functions ---------------------------------*/
void zapCTree(void *elem);
void zapLabel(pLabel elem);
void zapDeclInfo(void *elem);
void zapDclr(void *elem);
void zapDeclStructInfo(pDeclStructInfo elem);
void zapDeclStructBody(pDeclStructBody elem);
void zapArrElem(pArrElem elem);
void zapDclrPtr(pDclrPtr elem);
void zapDeclEnum(pDeclEnum elem);
void zapEnumElem(pEnumElem elem);
void zapToken(void *elem);
void zapTokens2(pToken elem1, pToken elem2);
void zapTokens3(pToken elem1, pToken elem2, pToken elem3);
void zapTokPos(pTokPos elem);

⌨️ 快捷键说明

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