0

私はコンパイラ用の語彙アナライザーを構築しており、ハッシュを使用してキーワードをすばやく認識しています。

私のハッシュ関数は次のとおりです。

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;

どんな助けでも大歓迎です。

4

1 に答える 1

-4

これはあなたの時間の無駄です。この時代、または実際に最初に登場した1988年頃以降のどの時代でも、フレックスを使用してレクサーを生成し、キーワードをルールとして個別に指定するだけで、キーワードを認識させる必要があります。これは、一般的な識別子を認識するのと同じくらい迅速に行うことができます。ハッシュテーブルはまったく必要ありません。

于 2013-03-09T00:01:06.583 に答える