私はコンパイラ用の語彙アナライザーを構築しており、ハッシュを使用してキーワードをすばやく認識しています。
私のハッシュ関数は次のとおりです。
int Eval_Hash(char *str)
{
int prime = 5381;
int i;
for(i = 0; i < strlen(str); i++)
prime = (prime*33) + str[i];
return (abs(prime%(KeyWordCount*KeyWordCount)));
}
次のコード スニペットを使用してキーワードをハッシュしています。
i = 0;
while(i < KeyWordCount) {
while(1)
{
tmp = (Eval_Hash(keywordList[i])+j*j)%(KeyWordCount*KeyWordCount);
if(h.Elem[tmp].hashVal == INT_MIN)
{
strcpy(h.Elem[tmp].name,tokenList[i]);
h.Elem[tmp].hashVal = tmp;
strcpy(h.Elem[tmp].value,keywordList[i]);
break;
}
j++;
}
i++;
}
しかし、字句解析を行っているとき、入力ストリームからの語彙素が別のスロットにハッシュされています。たとえば、'parameters' がキーワードであり、ハッシュテーブルの初期化中に既にハッシュされているとします。しかし、入力ストリームから「パラメーター」を読み取ると、他のトークンとして認識されます。
入力ストリームから文字列をハッシュするコード スニペットは次のとおりです。
Hash_Value = Eval_Hash(str);
printf("\n \n Hash Value: %d Modified Hash Value: %d \n \n ",Hash_Value,Hash_Value%(KeyWordCount*KeyWordCount));
count = 1;
for(j=0;count<KeyWordCount;j++)
{
tmp = (Hash_Value+j*j)%(KeyWordCount*KeyWordCount);
if(h.Elem[tmp].flag == 1)
count++;
else if(strcmp(h.Elem[tmp].value, str) == 0)
{
alpha_flag = 1;
h.Elem[tmp].flag = 1;
strcpy(token->name,h.Elem[tmp].name);
break;
}
else
h.Elem[tmp].flag = 1;
}
さらに、ハッシュテーブルの typedef は次のとおりです。
struct _hashElem {
int hashVal;
int flag;
char name[30];//keyw
char value[30];
};
typedef struct _hashElem hashElem;
struct _Hash {
hashElem Elem[KeyWordCount*KeyWordCount];
};
typedef struct _Hash Hash;
どんな助けでも大歓迎です。