c/c++ 宏的妙用

大家在进行C/C++编程的时候,常常定义一些枚举类型的数据,例如:
typedef enum TOKENID
{
TID_ARGS,
TID_MAKEREFANY    
} TOKENID;
然后在展示或者处理的过程中又要使用和此枚举相关的一些信息。如:
const TOKINFO   m_rgTokenInfo[TID_NUMTOKENS] = {
    {L"__arglist"  ,TFF_MSKEYWORD | TFF_TERM...},
    {L"__makeref"        ,  TFF_MSKEYWORD | TFF_TERM...}
};
一种机制
就是使用字典来解决,这样就需要手工保证两边加入的一致性。另一种更好的
解决方案是使用Macro来解决:
1、宏使用的定义
2、枚举定义
3、信息相关定义。

Mircrosoft在Rotor的C#编译器使用的一个例子:
1、宏使用的定义
// ===========================================================================
// File: tokens.h
//
// This header defines our token set.  Names, ID's, and other valuable per-token
// information is kept here.  To pull out significant pieces of each entry,
// define TOK appropriately before including this file.
//
//   Name                 Token ID          Flags                                             Predefined type             Statement parse routine             Binary operator     Unary operator      Self operator           Token Color      (end)
// ===========================================================================

#if !defined(TOK)
#error Must define TOK macro before including tokens.h
#endif

TOK(L"__arglist"        , TID_ARGS          , TFF_MSKEYWORD | TFF_TERM                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_ARGS               , KEYWORD           )
TOK(L"__makeref"        , TID_MAKEREFANY    , TFF_MSKEYWORD | TFF_TERM                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_MAKEREFANY         , KEYWORD           )
TOK(L"__reftype"        , TID_REFTYPE       , TFF_MSKEYWORD | TFF_TERM                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_REFTYPE            , KEYWORD           )
TOK(L"__refvalue"       , TID_REFVALUE      , TFF_MSKEYWORD | TFF_TERM                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_REFVALUE           , KEYWORD           )
TOK(L"abstract"         , TID_ABSTRACT      , TFF_MEMBER | TFF_NSELEMENT | TFF_MODIFIER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"as"               , TID_AS            , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_AS             , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"base"             , TID_BASE          , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_BASE               , KEYWORD           )
TOK(L"bool"             , TID_BOOL          , TFF_MEMBER | TFF_PREDEFINED                   , PT_BOOL                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"break"            , TID_BREAK         , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(BreakStatement)       , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"byte"             , TID_BYTE          , TFF_MEMBER | TFF_PREDEFINED                   , PT_BYTE                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"case"             , TID_CASE          , TFF_INVALIDSUBEXPRESSION                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"catch"            , TID_CATCH         , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(TryStatement)         , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"char"             , TID_CHAR          , TFF_MEMBER | TFF_PREDEFINED                   , PT_CHAR                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"checked"          , TID_CHECKED       , TFF_TERM                                      , 0                         , PARSEFN(CheckedStatement)     , OP_NONE           , OP_NONE           , OP_CHECKED            , KEYWORD           )
TOK(L"class"            , TID_CLASS         , TFF_NSELEMENT | TFF_TYPEDECL | TFF_MEMBER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"const"            , TID_CONST         , TFF_MEMBER | TFF_INVALIDSUBEXPRESSION         , 0                         , PARSEFN(ConstStatement)       , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"continue"         , TID_CONTINUE      , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(BreakStatement)       , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"decimal"          , TID_DECIMAL       , TFF_MEMBER | TFF_PREDEFINED                   , PT_DECIMAL                , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"default"          , TID_DEFAULT       , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_DEFAULT            , KEYWORD           )
TOK(L"delegate"         , TID_DELEGATE      , TFF_NSELEMENT | TFF_TYPEDECL | TFF_MEMBER | TFF_TERM, 0                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"do"               , TID_DO            , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(DoStatement)          , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"double"           , TID_DOUBLE        , TFF_MEMBER | TFF_PREDEFINED                   , PT_DOUBLE                 , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"else"             , TID_ELSE          , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"enum"             , TID_ENUM          , TFF_NSELEMENT | TFF_TYPEDECL | TFF_MEMBER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"event"            , TID_EVENT         , TFF_MEMBER                                    , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"explicit"         , TID_EXPLICIT      , TFF_OVLUNOP | TFF_OVLOPKWD                    , 0                         , NOPARSEFN                     , OP_NONE           , OP_EXPLICIT       , OP_NONE               , KEYWORD           )
TOK(L"extern"           , TID_EXTERN        , TFF_MEMBER | TFF_MODIFIER                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"false"            , TID_FALSE         , TFF_OVLUNOP | TFF_OVLOPKWD | TFF_TERM         , 0                         , NOPARSEFN                     , OP_NONE           , OP_FALSE          , OP_FALSE              , KEYWORD           )
TOK(L"finally"          , TID_FINALLY       , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(TryStatement)         , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"fixed"            , TID_FIXED         , TFF_MEMBER                                    , 0                         , PARSEFN(FixedStatement)       , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"float"            , TID_FLOAT         , TFF_MEMBER | TFF_PREDEFINED                   , PT_FLOAT                  , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"for"              , TID_FOR           , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(ForStatement)         , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"foreach"          , TID_FOREACH       , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(ForEachStatement)     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"goto"             , TID_GOTO          , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(GotoStatement)        , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"if"               , TID_IF            , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(IfStatement)          , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"in"               , TID_IN            , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"implicit"         , TID_IMPLICIT      , TFF_OVLUNOP | TFF_OVLOPKWD                    , 0                         , NOPARSEFN                     , OP_NONE           , OP_IMPLICIT       , OP_NONE               , KEYWORD           )
TOK(L"int"              , TID_INT           , TFF_MEMBER | TFF_PREDEFINED                   , PT_INT                    , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"interface"        , TID_INTERFACE     , TFF_NSELEMENT | TFF_TYPEDECL | TFF_MEMBER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"internal"         , TID_INTERNAL      , TFF_MEMBER | TFF_NSELEMENT | TFF_MODIFIER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"is"               , TID_IS            , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_IS             , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"lock"             , TID_LOCK          , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(LockStatement)        , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"long"             , TID_LONG          , TFF_MEMBER | TFF_PREDEFINED                   , PT_LONG                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"namespace"        , TID_NAMESPACE     , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"new"              , TID_NEW           , TFF_NSELEMENT | TFF_MEMBER | TFF_TERM | TFF_MODIFIER, 0                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"null"             , TID_NULL          , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NULL               , KEYWORD           )
TOK(L"object"           , TID_OBJECT        , TFF_MEMBER | TFF_PREDEFINED                   , PT_OBJECT                 , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"operator"         , TID_OPERATOR      , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"out"              , TID_OUT           , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"override"         , TID_OVERRIDE      , TFF_MEMBER | TFF_MODIFIER                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"params"           , TID_PARAMS        , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"private"          , TID_PRIVATE       , TFF_NSELEMENT | TFF_MEMBER | TFF_MODIFIER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"protected"        , TID_PROTECTED     , TFF_NSELEMENT | TFF_MEMBER | TFF_MODIFIER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"public"           , TID_PUBLIC        , TFF_MEMBER | TFF_NSELEMENT | TFF_MODIFIER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"readonly"         , TID_READONLY      , TFF_MEMBER | TFF_MODIFIER                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"ref"              , TID_REF           , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"return"           , TID_RETURN        , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(ReturnStatement)      , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"sbyte"            , TID_SBYTE         , TFF_MEMBER | TFF_PREDEFINED                   , PT_SBYTE                  , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"sealed"           , TID_SEALED        , TFF_NSELEMENT | TFF_MEMBER | TFF_MODIFIER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"short"            , TID_SHORT         , TFF_MEMBER | TFF_PREDEFINED                   , PT_SHORT                  , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"sizeof"           , TID_SIZEOF        , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_SIZEOF             , KEYWORD           )
TOK(L"stackalloc"       , TID_STACKALLOC    , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"static"           , TID_STATIC        , TFF_MEMBER | TFF_NSELEMENT | TFF_MODIFIER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"string"           , TID_STRING        , TFF_MEMBER | TFF_PREDEFINED                   , PT_STRING                 , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"struct"           , TID_STRUCT        , TFF_NSELEMENT | TFF_TYPEDECL | TFF_MEMBER     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"switch"           , TID_SWITCH        , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(SwitchStatement)      , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"this"             , TID_THIS          , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_THIS               , KEYWORD           )
TOK(L"throw"            , TID_THROW         , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(ThrowStatement)       , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"true"             , TID_TRUE          , TFF_OVLUNOP |  TFF_OVLOPKWD | TFF_TERM        , 0                         , NOPARSEFN                     , OP_NONE           , OP_TRUE           , OP_TRUE               , KEYWORD           )
TOK(L"try"              , TID_TRY           , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(TryStatement)         , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"typeof"           , TID_TYPEOF        , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_TYPEOF             , KEYWORD           )
TOK(L"uint"             , TID_UINT          , TFF_MEMBER | TFF_PREDEFINED                   , PT_UINT                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"ulong"            , TID_ULONG         , TFF_MEMBER | TFF_PREDEFINED                   , PT_ULONG                  , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"unchecked"        , TID_UNCHECKED     , TFF_TERM                                      , 0                         , PARSEFN(CheckedStatement)     , OP_NONE           , OP_NONE           , OP_UNCHECKED          , KEYWORD           )
TOK(L"unsafe"           , TID_UNSAFE        , TFF_NSELEMENT | TFF_MEMBER | TFF_MODIFIER     , 0                         , PARSEFN(UnsafeStatement)      , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"ushort"           , TID_USHORT        , TFF_MEMBER | TFF_PREDEFINED                   , PT_USHORT                 , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"using"            , TID_USING         , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(UsingStatement)       , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"virtual"          , TID_VIRTUAL       , TFF_MEMBER | TFF_MODIFIER                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"void"             , TID_VOID          , TFF_MEMBER | TFF_PREDEFINED                   , PT_VOID                   , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"volatile"         , TID_VOLATILE      , TFF_MEMBER | TFF_MODIFIER                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )
TOK(L"while"            , TID_WHILE         , TFF_INVALIDSUBEXPRESSION                      , 0                         , PARSEFN(WhileStatement)       , OP_NONE           , OP_NONE           , OP_NONE               , KEYWORD           )

// NOTE:  KEEP TID_IDENTIFIER AS THE FIRST NON-KEYWORD TOKEN!
// Also, if a token is "dynamic" in nature (meaning it must be re-scanned to get its 'value'), leave its name L""
TOK(L""                 , TID_IDENTIFIER    , TFF_MEMBER | TFF_TERM                         , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , IDENTIFIER        )
TOK(L""                 , TID_NUMBER        , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NUMBER            )
TOK(L""                 , TID_STRINGLIT     , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , STRING            )
TOK(L""                 , TID_VSLITERAL     , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , VSTRING           )
TOK(L""                 , TID_CHARLIT       , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , STRING            )
TOK(L""                 , TID_SLCOMMENT     , TFF_NOISE                                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , COMMENT           )
TOK(L""                 , TID_DOCCOMMENT    , TFF_NOISE                                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , DOCCOMMENT        )
TOK(L""                 , TID_MLCOMMENT     , TFF_NOISE                                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , COMMENT           )
TOK(L""                 , TID_MLDOCCOMMENT  , TFF_NOISE                                     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , DOCCOMMENT        )
TOK(L";"                , TID_SEMICOLON     , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L")"                , TID_CLOSEPAREN    , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L"]"                , TID_CLOSESQUARE   , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L"{"                , TID_OPENCURLY     , TFF_CASTEXPR                                  , 0                         , PARSEFN(Block)                , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L"}"                , TID_CLOSECURLY    , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L","                , TID_COMMA         , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L"="                , TID_EQUAL         , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_ASSIGN         , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"+="               , TID_PLUSEQUAL     , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_ADDEQ          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"-="               , TID_MINUSEQUAL    , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_SUBEQ          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"*="               , TID_SPLATEQUAL    , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_MULEQ          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"/="               , TID_SLASHEQUAL    , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_DIVEQ          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"%="               , TID_MODEQUAL      , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_MODEQ          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"&="               , TID_ANDEQUAL      , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_ANDEQ          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"^="               , TID_HATEQUAL      , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_XOREQ          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"|="               , TID_BAREQUAL      , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_OREQ           , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"<<="              , TID_SHIFTLEFTEQ   , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_LSHIFTEQ       , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L">>="              , TID_SHIFTRIGHTEQ  , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_RSHIFTEQ       , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"?"                , TID_QUESTION      , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_QUESTION       , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L":"                , TID_COLON         , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L"::"               , TID_COLONCOLON    , TFF_MEMBER                                    , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"||"               , TID_LOG_OR        , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_LOGOR          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"&&"               , TID_LOG_AND       , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_LOGAND         , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"|"                , TID_BAR           , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_BITOR          , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"^"                , TID_HAT           , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_BITXOR         , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"&"                , TID_AMPERSAND     , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_BITAND         , OP_ADDR           , OP_NONE               , OPERATOR          )
TOK(L"=="               , TID_EQUALEQUAL    , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_EQ             , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"!="               , TID_NOTEQUAL      , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_NEQ            , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"<"                , TID_LESS          , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_LT             , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"<="               , TID_LESSEQUAL     , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_LE             , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L">"                , TID_GREATER       , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_GT             , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L">="               , TID_GREATEREQUAL  , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_GE             , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"<<"               , TID_SHIFTLEFT     , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_LSHIFT         , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L">>"               , TID_SHIFTRIGHT    , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_RSHIFT         , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"+"                , TID_PLUS          , TFF_OVLUNOP | TFF_OVLBINOP | TFF_CASTEXPR     , 0                         , NOPARSEFN                     , OP_ADD            , OP_UPLUS          , OP_NONE               , OPERATOR          )
TOK(L"-"                , TID_MINUS         , TFF_OVLUNOP | TFF_OVLBINOP | TFF_CASTEXPR     , 0                         , NOPARSEFN                     , OP_SUB            , OP_NEG            , OP_NONE               , OPERATOR          )
TOK(L"*"                , TID_STAR          , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_MUL            , OP_INDIR          , OP_NONE               , OPERATOR          )
TOK(L"/"                , TID_SLASH         , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_DIV            , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"%"                , TID_PERCENT       , TFF_OVLBINOP | TFF_CASTEXPR                   , 0                         , NOPARSEFN                     , OP_MOD            , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"~"                , TID_TILDE         , TFF_MEMBER | TFF_OVLUNOP                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_BITNOT         , OP_NONE               , OPERATOR          )
TOK(L"!"                , TID_BANG          , TFF_OVLUNOP                                   , 0                         , NOPARSEFN                     , OP_NONE           , OP_LOGNOT         , OP_NONE               , OPERATOR          )
TOK(L"++"               , TID_PLUSPLUS      , TFF_OVLUNOP | TFF_CASTEXPR                    , 0                         , NOPARSEFN                     , OP_NONE           , OP_PREINC         , OP_NONE               , OPERATOR          )
TOK(L"--"               , TID_MINUSMINUS    , TFF_OVLUNOP | TFF_CASTEXPR                    , 0                         , NOPARSEFN                     , OP_NONE           , OP_PREDEC         , OP_NONE               , OPERATOR          )
TOK(L"("                , TID_OPENPAREN     , TFF_TERM                                      , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L"["                , TID_OPENSQUARE    , TFF_NSELEMENT | TFF_MEMBER | TFF_CASTEXPR     , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L"."                , TID_DOT           , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"->"               , TID_ARROW         , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L"??"               , TID_QUESTQUEST    , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_VALORDEF       , OP_NONE           , OP_NONE               , OPERATOR          )
TOK(L""                 , TID_ENDFILE       , TFF_CASTEXPR                                  , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L""                 , TID_UNKNOWN       , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
TOK(L""                 , TID_INVALID       , 0                                             , 0                         , NOPARSEFN                     , OP_NONE           , OP_NONE           , OP_NONE               , NORMAL            )
#undef  TOK

2、枚举定义
enum.h中定义了TOKENID

/////////////////////////////////////////////////////////////////////////////
// TOKENID

#define TOK(n, id, flags, type, stmtfunc, binop, unop, selfop, color) id,
typedef enum TOKENID
{
    #include "tokens.h"
    TID_NUMTOKENS,

    // aliases for generics    
    TID_OPENANGLE = TID_LESS,
    TID_CLOSEANGLE = TID_GREATER,
} TOKENID;

3、信息相关定义。
sccomp\parser.cpp L98
#define TOK(name, id, flags, type, stmtfunc, binop, unop, selfop, color) { name, flags, sizeof(name)/sizeof(WCHAR)-1, stmtfunc, type, binop, unop, selfop },
#define PARSEFN(func) CParser::EParse##func
#define NOPARSEFN CParser::EParseNone
const TOKINFO   CParser::m_rgTokenInfo[TID_NUMTOKENS] = {
    #include "tokens.h"
};
#undef  PARSEFN
#undef  NOPARSEFN

原文地址:https://www.cnblogs.com/peanut/p/1111144.html