int _num_tokens;
int _cur_token;
+struct {
+ const char *keyword;
+ token_type_t type;
+} _keywords[] = {
+ { "auto", TOKEN_AUTO },
+ { "register", TOKEN_REGISTER },
+ { "static", TOKEN_STATIC },
+ { "extern", TOKEN_EXTERN },
+ { "typedef", TOKEN_TYPEDEF },
+ { "void", TOKEN_VOID },
+ { "char", TOKEN_CHAR },
+ { "short", TOKEN_SHORT },
+ { "int", TOKEN_INT },
+ { "long", TOKEN_LONG },
+ { "float", TOKEN_FLOAT },
+ { "double", TOKEN_DOUBLE },
+ { "signed", TOKEN_SIGNED },
+ { "unsigned", TOKEN_UNSIGNED },
+ { "const", TOKEN_CONST },
+ { "volatile", TOKEN_VOLATILE },
+ { "restrict", TOKEN_RESTRICT },
+ { "struct", TOKEN_STRUCT },
+ { "union", TOKEN_UNION },
+ { "enum", TOKEN_ENUM },
+ { "goto", TOKEN_GOTO },
+ { "case", TOKEN_CASE },
+ { "break", TOKEN_BREAK },
+ { "continue", TOKEN_CONTINUE },
+ { "default", TOKEN_DEFAULT },
+ { "if", TOKEN_IF },
+ { "else", TOKEN_ELSE },
+ { "switch", TOKEN_SWITCH },
+ { "while", TOKEN_WHILE },
+ { "do", TOKEN_DO },
+ { "for", TOKEN_FOR },
+ { "return", TOKEN_RETURN },
+ { "sizeof", TOKEN_SIZEOF },
+ { NULL, TOKEN_INVALID }
+};
+
struct tokenlist {
struct token *token;
struct tokenlist *next;
return(ret_val);
}
+static void _identify_token(struct token *t)
+{
+ int i;
+
+ assert(t->type == TOKEN_IDENTIFIER);
+
+ for(i = 0; _keywords[i].keyword; i++) {
+ if(token_cmp(t, _keywords[i].keyword) == 0) {
+ t->type = _keywords[i].type;
+ break;
+ }
+ }
+
+ return;
+}
+
struct token *_nexttoken(void)
{
struct token *tok;
case STATE_CHR:
if(!tok) {
- tok = token_new_from_str(TOKEN_CHAR, _line, _col, "'");
+ tok = token_new_from_str(TOKEN_CHAR_LITERAL, _line, _col, "'");
assert(tok);
}
token_append_char(tok, c);
} else {
_putnextchar(c);
+ _identify_token(tok);
return(tok);
}