#ifndef __SMCC_CC_TOKEN_H__ #define __SMCC_CC_TOKEN_H__ #include enum CSTD_KEYWORD { CSTD_C89, CSTD_C99, CEXT_ASM, }; // Using Binary Search To Fast Find Keyword #define KEYWORD_TABLE \ X(asm , CEXT_ASM, TOKEN_ASM) \ X(break , CSTD_C89, TOKEN_BREAK) \ X(case , CSTD_C89, TOKEN_CASE) \ X(char , CSTD_C89, TOKEN_CHAR) \ X(const , CSTD_C89, TOKEN_CONST) \ X(continue , CSTD_C89, TOKEN_CONTINUE) \ X(default , CSTD_C89, TOKEN_DEFAULT) \ X(do , CSTD_C89, TOKEN_DO) \ X(double , CSTD_C89, TOKEN_DOUBLE) \ X(else , CSTD_C89, TOKEN_ELSE) \ X(enum , CSTD_C89, TOKEN_ENUM) \ X(extern , CSTD_C89, TOKEN_EXTERN) \ X(float , CSTD_C89, TOKEN_FLOAT) \ X(for , CSTD_C89, TOKEN_FOR) \ X(goto , CSTD_C89, TOKEN_GOTO) \ X(if , CSTD_C89, TOKEN_IF) \ X(inline , CSTD_C99, TOKEN_INLINE) \ X(int , CSTD_C89, TOKEN_INT) \ X(long , CSTD_C89, TOKEN_LONG) \ X(register , CSTD_C89, TOKEN_REGISTER) \ X(restrict , CSTD_C99, TOKEN_RESTRICT) \ X(return , CSTD_C89, TOKEN_RETURN) \ X(short , CSTD_C89, TOKEN_SHORT) \ X(signed , CSTD_C89, TOKEN_SIGNED) \ X(sizeof , CSTD_C89, TOKEN_SIZEOF) \ X(static , CSTD_C89, TOKEN_STATIC) \ X(struct , CSTD_C89, TOKEN_STRUCT) \ X(switch , CSTD_C89, TOKEN_SWITCH) \ X(typedef , CSTD_C89, TOKEN_TYPEDEF) \ X(union , CSTD_C89, TOKEN_UNION) \ X(unsigned , CSTD_C89, TOKEN_UNSIGNED) \ X(void , CSTD_C89, TOKEN_VOID) \ X(volatile , CSTD_C89, TOKEN_VOLATILE) \ X(while , CSTD_C89, TOKEN_WHILE) \ // KEYWORD_TABLE #define TOKEN_TABLE \ X(init , TK_BASIC_INVALID, TOKEN_INIT) \ X(EOF , TK_BASIC_EOF, TOKEN_EOF) \ X(blank , TK_BASIC_WHITESPACE, TOKEN_BLANK) \ X("==" , TK_BASIC_OPERATOR, TOKEN_EQ) \ X("=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN) \ X("++" , TK_BASIC_OPERATOR, TOKEN_ADD_ADD) \ X("+=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_ADD) \ X("+" , TK_BASIC_OPERATOR, TOKEN_ADD) \ X("--" , TK_BASIC_OPERATOR, TOKEN_SUB_SUB) \ X("-=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_SUB) \ X("->" , TK_BASIC_OPERATOR, TOKEN_DEREF) \ X("-" , TK_BASIC_OPERATOR, TOKEN_SUB) \ X("*=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_MUL) \ X("*" , TK_BASIC_OPERATOR, TOKEN_MUL) \ X("/=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_DIV) \ X("/" , TK_BASIC_OPERATOR, TOKEN_DIV) \ X("//" , TK_BASIC_COMMENT , TOKEN_LINE_COMMENT) \ X("/* */" , TK_BASIC_COMMENT , TOKEN_BLOCK_COMMENT) \ X("%=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_MOD) \ X("%" , TK_BASIC_OPERATOR, TOKEN_MOD) \ X("&&" , TK_BASIC_OPERATOR, TOKEN_AND_AND) \ X("&=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_AND) \ X("&" , TK_BASIC_OPERATOR, TOKEN_AND) \ X("||" , TK_BASIC_OPERATOR, TOKEN_OR_OR) \ X("|=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_OR) \ X("|" , TK_BASIC_OPERATOR, TOKEN_OR) \ X("^=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_XOR) \ X("^" , TK_BASIC_OPERATOR, TOKEN_XOR) \ X("<<=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_L_SH) \ X("<<" , TK_BASIC_OPERATOR, TOKEN_L_SH) \ X("<=" , TK_BASIC_OPERATOR, TOKEN_LE) \ X("<" , TK_BASIC_OPERATOR, TOKEN_LT) \ X(">>=" , TK_BASIC_OPERATOR, TOKEN_ASSIGN_R_SH) \ X(">>" , TK_BASIC_OPERATOR, TOKEN_R_SH) \ X(">=" , TK_BASIC_OPERATOR, TOKEN_GE) \ X(">" , TK_BASIC_OPERATOR, TOKEN_GT) \ X("!" , TK_BASIC_OPERATOR, TOKEN_NOT) \ X("!=" , TK_BASIC_OPERATOR, TOKEN_NEQ) \ X("~" , TK_BASIC_OPERATOR, TOKEN_BIT_NOT) \ X("[" , TK_BASIC_OPERATOR, TOKEN_L_BRACKET) \ X("]" , TK_BASIC_OPERATOR, TOKEN_R_BRACKET) \ X("(" , TK_BASIC_OPERATOR, TOKEN_L_PAREN) \ X(")" , TK_BASIC_OPERATOR, TOKEN_R_PAREN) \ X("{" , TK_BASIC_OPERATOR, TOKEN_L_BRACE) \ X("}" , TK_BASIC_OPERATOR, TOKEN_R_BRACE) \ X(";" , TK_BASIC_OPERATOR, TOKEN_SEMICOLON) \ X("," , TK_BASIC_OPERATOR, TOKEN_COMMA) \ X(":" , TK_BASIC_OPERATOR, TOKEN_COLON) \ X("." , TK_BASIC_OPERATOR, TOKEN_DOT) \ X("..." , TK_BASIC_OPERATOR, TOKEN_ELLIPSIS) \ X("?" , TK_BASIC_OPERATOR, TOKEN_COND) \ X(ident , TK_BASIC_IDENTIFIER, TOKEN_IDENT) \ X(int_literal , TK_BASIC_LITERAL, TOKEN_INT_LITERAL) \ X(float_literal , TK_BASIC_LITERAL, TOKEN_FLOAT_LITERAL) \ X(char_literal , TK_BASIC_LITERAL, TOKEN_CHAR_LITERAL) \ X(string_literal , TK_BASIC_LITERAL, TOKEN_STRING_LITERAL) \ // END // 定义TokenType枚举 typedef enum cc_tktype { // 处理普通token #define X(str, basic, tok) tok, TOKEN_TABLE #undef X // 处理关键字(保持原有格式) #define X(name, std, tok) tok, KEYWORD_TABLE #undef X } cc_tktype_t; typedef struct tok_stream { int cur; int end; int peek; int size; int cap; tok_t* buf; void* stream; void (*gettok)(void* stream, tok_t* token); } tok_stream_t; typedef void(*tok_stream_get_func)(void* stream, tok_t* token); void init_tokbuf(tok_stream_t* tokbuf, void* stream, tok_stream_get_func gettok); tok_t* peek_tok(tok_stream_t* tokbuf); tok_t* pop_tok(tok_stream_t* tokbuf); void flush_peek_tok(tok_stream_t* tokbuf); cc_tktype_t peek_tok_type(tok_stream_t* tokbuf); int expect_pop_tok(tok_stream_t* tokbuf, cc_tktype_t type); const char* get_tok_name(cc_tktype_t type); #endif