Вы можете использовать gperf ( website ) для генерации идеального хэша, который превращает строки в целые числа. У вас будет что-то вроде этого:
В вашем заголовочном файле:
enum {
STR_VAR_TOKEN_e,
STR_INT_e,
STR_BOOL_e
};
int get_index(char *str);
В вашем файле gperf:
struct entry;
#include <string.h>
#include "header.h"
struct entry { char *name; int value; };
%language=ANSI-C
%struct-type
%%
VAR_TOKEN_e, STR_VAR_TOKEN_e
INT_e, STR_INT_e
BOOL_e, STR_BOOL_e
%%
int get_index(char *str)
{
struct entry *e = in_word_set(str, strlen(str));
return e ? e->value : -1;
}
В вашем выражении переключения:
switch (get_index(node->node_kind)) {
case STR_VAR_TOKEN_e: ...
...
}