ppopsdef.h

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 811 行 · 第 1/2 页

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


// PPOPSDEF.H -- define operators
//
// PPOPCG -- defines code-generation requirements
// PPOPAN -- defines table for ANALYSE.C
// PPOPCD -- defines an operator code
// PPOPIM -- defines impossible entry for ANALYSE.C
//           -- can be deleted with a table re-arrangement
// PPOPNAME -- defines start of CO_NAME_...
// PPOPNM -- define CO_NAME...
// PPOPOP -- define mangled version of operator name
//
// This file is never directly #included. Use the following:
//
//  * PPOPS.H       -- enumerate CO_...
//  * PPOPSAN.H     -- generate internal table in ANALYSE.C
//  * PPOPSFLG.H    -- generate the flags column
//  * PPOPSCOP.H    -- generate the CGOP column
//  * PPOPSNAM.H    -- generate names for the CGOP column (debug only)
//  * PPOPSLNM.H    -- generate long names for the CGOP column
//  * PPOPFNAM.H    -- generate names for the Internal Names column
//
// 91/06/25 -- J.W.Welch        -- defined
// 91/10/25 -- J.W.Welch        -- added internal names
// 91/12/04 -- J.W.Welch        -- introduced PPOP.. macros
// 92/01/29 -- J.W.Welch        -- introduced OPCNV_... bits
// 92/12/18 -- Greg Bentz       -- added PPOPSLNM.H
// 93/01/18 -- Greg Bentz       -- added PPOPOP
// 93/09/29 -- A.F.Scian        -- added delete [] and new []
// 95/02/16 -- A.F.Scian        -- moved non-null PPOPOP operators up so that
//                                 CppLookupName doesn't have to sift through
//                                 impossible operator names to lookup valid
//                                 operator names

// define null macros as required

#ifndef PPOPCD
    #define PPOPCD( a )
#endif

#ifndef PPOPOP
    #define PPOPOP( a, sa )
#endif

#ifndef PPOPCG
    #define PPOPCG( a, b, c )
#endif

#ifndef PPOPIM
    #define PPOPIM
#endif

#ifndef PPOPAN
    // ptr op ptr, ptr op arith, arith op ptr, arith op arith, other
    #define PPOPAN( a, b, c, d, e )
#endif

#ifndef PPOPNMS
    #define PPOPNMS
#endif

#ifndef PPOPNM
    #define PPOPNM( a )
#endif

#ifndef PPOPEND
    #define PPOPEND
#endif


#ifndef ONLY_INTRINSIC

#define delim

PPOPCD( PLUS )
PPOPOP( "oj", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_PLUS, O_PLUS, "+" )
PPOPAN( ER__BOTH_PTR, LVALUE_BEXPR, SW_LV_EXPR, BIN_ARITH, ER__ONLY_AP )//o+o

#undef  delim
#define delim ,

PPOPCD( MINUS )
PPOPOP( "oi", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_MINUS, O_MINUS, "-" )
PPOPAN( MINUS_PP, LVALUE_BEXPR, ER__SUB_AP, BIN_ARITH, ER__ONLY_AP )//o-o

PPOPCD( TIMES )
PPOPOP( "of", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_TWO_AR, O_TIMES, "*" )
PPOPAN( ER__ONLY_AR, ER__ONLY_AR, ER__ONLY_AR, BIN_ARITH, ER__ONLY_AR )//o*o

PPOPCD( DIVIDE )
PPOPOP( "om", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_TWO_AR, O_DIV, "/" )
PPOPAN( ER__ONLY_AR, ER__ONLY_AR, ER__ONLY_AR, BIN_ARITH, ER__ONLY_AR )//o/o

PPOPCD( PERCENT )
PPOPOP( "on", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_TWO_INT, O_MOD, "%" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, BIN_ARITH_I, ER__ONLY_IN )//o%o

PPOPCD( AND )
PPOPOP( "ok", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_TWO_INT, O_AND, "&" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, BIN_ARITH_I, ER__ONLY_IN )//o&o

PPOPCD( OR )
PPOPOP( "os", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_TWO_INT, O_OR, "|" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, BIN_ARITH_I, ER__ONLY_IN )//o|o

PPOPCD( XOR )
PPOPOP( "or", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_TWO_INT, O_XOR, "^" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, BIN_ARITH_I, ER__ONLY_IN )//o^o

PPOPCD( RSHIFT )
PPOPOP( "oa", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_SHIFT, O_RSHIFT, ">>" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, SHIFT_OP, ER__ONLY_IN )//o>>o

PPOPCD( LSHIFT )
PPOPOP( "ob", INVALID )
PPOPCG( PTO_BIN_ARITH | OPCNV_SHIFT, O_LSHIFT, "<<" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, SHIFT_OP, ER__ONLY_IN )//o<<o

PPOPCD( UMINUS )
PPOPOP( "oi", MINUS )
PPOPCG( PTO_UN_ARITH | OPCNV_ONE_AR, O_UMINUS, "-" )
PPOPAN( ER__ONLY_AR, IMPOSSIBLE, IMPOSSIBLE, UN_ARITH, ER__ONLY_IN )//-o

PPOPCD( TILDE )
PPOPOP( "oq", INVALID )
PPOPCG( PTO_UN_ARITH | OPCNV_ONE_INT, O_COMPLEMENT, "~" )
PPOPAN( ER__ONLY_IN, IMPOSSIBLE, IMPOSSIBLE, UN_ARITH_I, ER__ONLY_IN )//~o

PPOPCD( ADDR_OF )
PPOPOP( "ok", AND )
PPOPCG( PTO_ADDR_OPER, 0, "&" )
PPOPAN( ADDR_OF, IMPOSSIBLE, IMPOSSIBLE, ADDR_OF, ADDR_OF )//&o

PPOPCD( EQUAL )
PPOPOP( "aa", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQUALS | PTO_ASSIGN_SAME, O_GETS, "=" )
PPOPAN( EQUAL_PP, EQUAL_PZ, EQUAL_AP, EQUAL_AA, EQUAL_OTHER )//o=o

PPOPCD( EQ )
PPOPOP( "ra", INVALID )
PPOPCG( PTO_COMPARES | OPCNV_RELEQ, O_EQ, "==" )
PPOPAN( CMP_PP, CMP_PTR_ZERO, CMP_ZERO_PTR, CMP_AA, CMP_MP )//o==o

PPOPCD( NE )
PPOPOP( "rb", INVALID )
PPOPCG( PTO_COMPARES | OPCNV_RELEQ, O_NE, "!=" )
PPOPAN( CMP_PP, CMP_PTR_ZERO, CMP_ZERO_PTR, CMP_AA, CMP_MP )//o!=o

PPOPCD( GT )
PPOPOP( "re", INVALID )
PPOPCG( PTO_COMPARES | OPCNV_RELN, O_GT, ">" )
PPOPAN( CMP_PP, CMP_PTR_ZERO, CMP_ZERO_PTR, CMP_AA, ER__ONLY_AP )//o>o

PPOPCD( LE )
PPOPOP( "rd", INVALID )
PPOPCG( PTO_COMPARES | OPCNV_RELN, O_LE, "<=" )
PPOPAN( CMP_PP, CMP_PTR_ZERO, CMP_ZERO_PTR, CMP_AA, ER__ONLY_AP )//o<=o

PPOPCD( LT )
PPOPOP( "rc", INVALID )
PPOPCG( PTO_COMPARES | OPCNV_RELN, O_LT, "<" )
PPOPAN( CMP_PP, CMP_PTR_ZERO, CMP_ZERO_PTR, CMP_AA, ER__ONLY_AP )//o<o

PPOPCD( GE )
PPOPOP( "rf", INVALID )
PPOPCG( PTO_COMPARES | OPCNV_RELN, O_GE, ">=" )
PPOPAN( CMP_PP, CMP_PTR_ZERO, CMP_ZERO_PTR, CMP_AA, ER__ONLY_AP )//o>=o

PPOPCD( AND_AND )
PPOPOP( "ot", INVALID )
PPOPCG( PTO_FLOW_BINARY | OPCNV_LOG2, O_FLOW_AND, "&&" )
PPOPAN( BIN_LOG_PP, BIN_LOG_PA, BIN_LOG_AP, BIN_LOG_AA, BIN_LOG_MP )//o&&o

PPOPCD( OR_OR )
PPOPOP( "ou", INVALID )
PPOPCG( PTO_FLOW_BINARY | OPCNV_LOG2, O_FLOW_OR, "||" )
PPOPAN( BIN_LOG_PP, BIN_LOG_PA, BIN_LOG_AP, BIN_LOG_AA, BIN_LOG_MP )//o&&o

PPOPCD( EXCLAMATION )
PPOPOP( "oc", INVALID )
PPOPCG( PTO_FLOW_UNARY | OPCNV_LOG1, O_FLOW_NOT, "!" )
PPOPAN( UN_LOG_P, UN_LOG_P, UN_LOG, UN_LOG, UN_LOG_MP )//!o

PPOPCD( ARROW )
PPOPOP( "oe", INVALID )
PPOPCG( PTO_POINTS_TO | OPCNV_ARROW, O_PLUS, "->" )
PPOPIM

PPOPCD( INDEX )
PPOPOP( "od", INVALID )
PPOPCG( PTO_INDEX | OPCNV_SUBSCR, 0, "[]" )
PPOPAN( ER__PP_INDEX, INDEX_PA, INDEX_AP, ER__INDEX, ER__INDEX )//o[o]

PPOPCD( PLUS_EQUAL )
PPOPOP( "ac", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQAP | PTO_ASSIGN_SAME, O_PLUS, "+=" )
PPOPAN( ER__BOTH_PTR, OPEQ_PTR, ER__AP_ASSN, OPEQ_ARITH, ER__ONLY_AP )//o+=o

PPOPCD( MINUS_EQUAL )
PPOPOP( "ad", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQAP | PTO_ASSIGN_SAME, O_MINUS, "-=" )
PPOPAN( ER__BOTH_PTR, OPEQ_PTR, ER__AP_ASSN, OPEQ_ARITH, ER__ONLY_AP )//o-=o

PPOPCD( TIMES_EQUAL )
PPOPOP( "ab", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQAR, O_TIMES, "*=" )
PPOPAN( ER__ONLY_AR, ER__ONLY_AR, ER__ONLY_AR, OPEQ_ARITH, ER__ONLY_AR )//o*=o

PPOPCD( DIVIDE_EQUAL )
PPOPOP( "ae", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQAR, O_DIV, "/=" )
PPOPAN( ER__ONLY_AR, ER__ONLY_AR, ER__ONLY_AR, OPEQ_ARITH, ER__ONLY_AR )//o/=o

PPOPCD( PERCENT_EQUAL )
PPOPOP( "af", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQINT, O_MOD, "%=" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, OPEQ_INT, ER__ONLY_IN )//o%=o

PPOPCD( AND_EQUAL )
PPOPOP( "ai", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQINT | PTO_ASSIGN_SAME, O_AND, "&=" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, OPEQ_INT, ER__ONLY_IN )//o&=o

PPOPCD( OR_EQUAL )
PPOPOP( "aj", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQINT | PTO_ASSIGN_SAME, O_OR, "|=" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, OPEQ_INT, ER__ONLY_IN )//o|=o

PPOPCD( XOR_EQUAL )
PPOPOP( "ak", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQINT | PTO_ASSIGN_SAME, O_XOR, "^=" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, OPEQ_INT, ER__ONLY_IN )//o^=o

PPOPCD( RSHIFT_EQUAL )
PPOPOP( "ag", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQINT, O_RSHIFT, ">>=" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, OPEQ_SHIFT, ER__ONLY_IN )//o>>=o

PPOPCD( LSHIFT_EQUAL )
PPOPOP( "ah", INVALID )
PPOPCG( PTO_BIN_ASSIGN | OPCNV_EQINT, O_LSHIFT, "<<=" )
PPOPAN( ER__ONLY_IN, ER__ONLY_IN, ER__ONLY_IN, OPEQ_SHIFT, ER__ONLY_IN )//o<<=o

PPOPCD( UPLUS )
PPOPOP( "oj", PLUS )
PPOPCG( PTO_UN_ARITH | OPCNV_ONE_AR, 0, "+" )
PPOPAN( UN_PLUS_PTR, IMPOSSIBLE, IMPOSSIBLE, UN_ARITH, ER__ONLY_AR )//+o

// these four operators must be in the same order as their BPRE/BPOST equivalents

PPOPCD( PRE_PLUS_PLUS )
PPOPOP( "og", INVALID )
PPOPCG( PTO_UN_ASSIGN | OPCNV_ONE_RAP, 0, "++" )
PPOPAN( LINCDEC_PTR, IMPOSSIBLE, IMPOSSIBLE, LINCDEC_ARITH, ER__ONLY_AP )//++o

PPOPCD( PRE_MINUS_MINUS )
PPOPOP( "oh", INVALID )
PPOPCG( PTO_UN_ASSIGN | OPCNV_ONE_RAP, 0, "--" )
PPOPAN( LINCDEC_PTR, IMPOSSIBLE, IMPOSSIBLE, LINCDEC_ARITH, ER__ONLY_AP )//--o

PPOPCD( POST_PLUS_PLUS )
PPOPOP( "og", PRE_PLUS_PLUS )
PPOPCG( PTO_UN_ASSIGN | OPCNV_POST_OP, 0, "++" )
PPOPAN( INCDEC_PTR, IMPOSSIBLE, IMPOSSIBLE, INCDEC_ARITH, ER__ONLY_AP )//o++

PPOPCD( POST_MINUS_MINUS )
PPOPOP( "oh", PRE_MINUS_MINUS )
PPOPCG( PTO_UN_ASSIGN | OPCNV_POST_OP, 0, "--" )
PPOPAN( INCDEC_PTR, IMPOSSIBLE, IMPOSSIBLE, INCDEC_ARITH, ER__ONLY_AP )//o--

PPOPCD( INDIRECT )
PPOPOP( "of", TIMES )
PPOPCG( PTO_ADDR_OPER | OPCNV_PTR, O_POINTS, "*" )
PPOPAN( INDIRECT, IMPOSSIBLE, IMPOSSIBLE, ER__NO_PTR, ER__NO_PTR )//*o

PPOPCD( COMMA )
PPOPOP( "oo", INVALID )
PPOPCG( PTO_BINARY_OVLD, O_COMMA, "," )
PPOPAN( COMMA, COMMA, COMMA, COMMA, COMMA )//o, o

PPOPCD( ARROW_STAR )
PPOPOP( "ol", INVALID )
PPOPCG( PTO_BINARY_OVLD | OPCNV_ARROW_STAR, 0, "->*" )
PPOPAN( ARROW_STAR, ARROW_STAR, ARROW_STAR, ARROW_STAR, ARROW_STAR )//o->*o

PPOPCD( CALL )
PPOPOP( "op", INVALID )
PPOPCG( PTO_FUNCALL | OPCNV_FUNCTION, 0, "()" )
PPOPAN( CALL, CALL, ER__NOT_FUN, ER__NOT_FUN, CALL )//o(o)

PPOPCD( CONVERT )
PPOPOP( "cv", INVALID )
PPOPCG( PTO_BINARY_NO_OVLD, O_CONVERT, "CONV" )
PPOPAN( CAST, CAST, CAST, CAST, CAST )//convert

PPOPCD( NEW )
PPOPOP( "nw", INVALID )
PPOPCG( PTO_BINARY_NO_OVLD, 0, "new" )
PPOPAN( NEW, NEW, NEW, NEW, NEW )//new

PPOPCD( NEW_ARRAY )
PPOPOP( "na", INVALID )
PPOPCG( PTO_BINARY_NO_OVLD, 0, "new[]" )
PPOPAN( NEW, NEW, NEW, NEW, NEW )//new

PPOPCD( DELETE )
PPOPOP( "dl", INVALID )
PPOPCG( PTO_UNARY_NO_OVLD, 0, "delete" )
PPOPAN( DLT, DLT, DLT, DLT, DLT )//delete

PPOPCD( DELETE_ARRAY )
PPOPOP( "da", INVALID )
PPOPCG( PTO_UNARY_NO_OVLD, 0, "delete[]" )
PPOPAN( DLT, DLT, DLT, DLT, DLT )//delete_array

PPOPCD( DTOR )
PPOPOP( "dt", INVALID )
PPOPCG( PTO_BINARY_CPP, 0, "DTOR" )
PPOPIM

PPOPCD( CTOR )
PPOPOP( "ct", INVALID )
PPOPCG( PTO_BINARY_CPP, 0, "CTOR" )
PPOPAN( CTOR, CTOR, CTOR, CTOR, CTOR )//ctor

//---
PPOPCD( DOT )
PPOPCG( PTO_DOT, O_PLUS, "." )
PPOPIM

PPOPCD( QUESTION )
PPOPCG( PTO_BINARY_NO_OVLD | OPCNV_QUESTION, 0, "" )
PPOPAN( QUESTMRK, QUESTMRK, QUESTMRK, QUESTMRK, QUESTMRK )//o?o

PPOPCD( COLON )
//PPOPCG( PTO_BINARY_NO_OVLD | OPCNV_COLON, 0, "" )
PPOPCG( PTO_BINARY_NO_OVLD , 0, "" )
PPOPAN( COLON_PP, COLON_PA, COLON_AP, COLON_AA, COLON_OTHER )//o:o

PPOPCD( LIST )
PPOPCG( PTO_BINARY_NO_OVLD, 0, "" )
PPOPAN( PARAMETER_P, PARAMETER, PARAMETER_P, PARAMETER, PARAMETER_P )//list

PPOPCD( DOT_STAR )
PPOPCG( PTO_DOT, 0, ".*" )
PPOPAN( DOT_STAR, DOT_STAR, DOT_STAR, DOT_STAR, DOT_STAR )//o.*o

PPOPCD( CONVERT_INT )
PPOPCG( PTO_UNARY_CPP | OPCNV_ONE_INT, O_NOP, "" )
PPOPAN( ER__ONLY_IN, IMPOSSIBLE, IMPOSSIBLE, CONVERT_INT, CONVERT_INT )

PPOPCD( SIZEOF_TYPE )
PPOPCG( PTO_UNARY_NO_OVLD, 0, "" )
PPOPAN( OP_SIZEOF, IMPOSSIBLE, IMPOSSIBLE, OP_SIZEOF, OP_SIZEOF )//sizeof-type

PPOPCD( SIZEOF_EXPR )
PPOPCG( PTO_UNARY_NO_OVLD, 0, "" )
PPOPAN( OP_SIZEOF, IMPOSSIBLE, IMPOSSIBLE, OP_SIZEOF, OP_SIZEOF )//sizeof-expr

PPOPCD( OFFSETOF )
PPOPCG( PTO_BINARY_NO_OVLD, 0, "" )
PPOPAN( IMPOSSIBLE, IMPOSSIBLE, IMPOSSIBLE, IMPOSSIBLE, DO_NOTHING )

PPOPCD( STORAGE )
PPOPCG( PTO_BINARY_NO_OVLD, 0, "storage" )
PPOPAN( IMPOSSIBLE, IMPOSSIBLE, IMPOSSIBLE, IMPOSSIBLE, DO_NOTHING )

⌨️ 快捷键说明

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