/* token.h */ #ifndef TOKEN_H #define TOKEN_H #include // We use this for int64_t #include "hash_table.h" // We need this for the string table /* Token Types */ typedef enum { // Control Keywords TOK_IF, TOK_ELSE, TOK_SWITCH, TOK_CASE, TOK_DEFAULT, TOK_WHILE, TOK_DO, TOK_FOR, TOK_CONTINUE, TOK_BREAK, TOK_RETURN, TOK_GOTO, // Type Keywords TOK_VOID, TOK_CHAR, TOK_SHORT, TOK_INT, TOK_LONG, TOK_FLOAT, TOK_DOUBLE, TOK_SIGNED, TOK_UNSIGNED, TOK_STRUCT, TOK_UNION, TOK_ENUM, TOK_TYPEDEF, // Storage Class/Specifier Keywords TOK_AUTO, TOK_REGISTER, TOK_STATIC, TOK_EXTERN, TOK_CONST, TOK_VOLATILE, // Misc Keywords TOK_SIZEOF, // Operators TOK_ADD, // + TOK_SUB, // - TOK_MUL, // * TOK_DIV, // / TOK_MOD, // % TOK_BIT_AND, // & TOK_BIT_OR, // | TOK_BIT_XOR, // ^ TOK_BIT_NOT, // ~ TOK_LSHIFT, // << TOK_RSHIFT, // >> TOK_NOT, // ! TOK_ASSIGN, // = TOK_LT, // < TOK_GT, // > TOK_INC, // ++ TOK_DEC, // -- TOK_EQ, // == TOK_NE, // != TOK_LE, // <= TOK_GE, // >= TOK_AND, // && TOK_OR, // || TOK_MEMBER_POINTER, // -> TOK_MEMBER, // . TOK_COND_DECISION, // : TOK_COND, // ? TOK_ASSIGN_ADD, // += TOK_ASSIGN_SUB, // -= TOK_ASSIGN_MUL, // *= TOK_ASSIGN_DIV, // /= TOK_ASSIGN_MOD, // %= TOK_ASSIGN_BITAND, // &= TOK_ASSIGN_BITOR, // |= TOK_ASSIGN_BITXOR, // ^= TOK_ASSIGN_LSHIFT, // <<= TOK_ASSIGN_RSHIFT, // >>= // Separators TOK_LEFT_PAREN, // ( TOK_RIGHT_PAREN, // ) TOK_LEFT_BRACKET, // [ TOK_RIGHT_BRACKET, // ] TOK_LEFT_BRACE, // { TOK_RIGHT_BRACE, // } TOK_COMMA, // , TOK_SEMICOLON, // ; TOK_DOT, // . TOK_ELLIPSIS, // ... TOK_HASH, // # // Identifiers TOK_ID, TOK_TYPEDEF_NAME, // Constants TOK_INTEGER_U32, // u TOK_INTEGER_U64, // ul TOK_INTEGER_S32, // (no suffix) TOK_INTEGER_S64, // l TOK_FLOAT_32, // f TOK_FLOAT_64, // (no suffix) TOK_CHAR_CONST, // 'c' TOK_STRING_ASCII, // "string" (width of 8 bits) // Special TOK_EOF, TOK_ERROR, } c_token_types; /* Opaque Token Type */ typedef struct token token_t; /* Token Creation and Destruction Interface */ token_t *token_create(c_token_types kind, int lin, int col, int len); token_t *token_create_int(c_token_types kind, int lin, int col, int64_t i, int len); token_t *token_create_float(c_token_types kind, int lin, int col, double f, int len); token_t *token_create_char(c_token_types kind, int lin, int col, char c, int len); token_t *token_create_string(c_token_types kind, int lin, int col, const char *s, int len); void token_destroy(token_t *token); /* Token Interface */ c_token_types token_type(token_t *token); int64_t token_int(token_t *token); double token_float(token_t *token); const char *token_string(token_t *token); char token_char(token_t *token); int token_line(token_t *token); int token_column(token_t *token); void print_token(token_t *tok); extern hash_table_t *string_table; extern int column; extern int line; #endif