大家在进行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