10、链式哈希表的应用-符号表

来源:互联网 发布:lda模型 矩阵分解 编辑:程序博客网 时间:2024/05/21 10:14

应用简介:哈希表会应用于编译器中,满足快速存取符号信息的需求。把源码中有组织的字符转换为有意义的字符串(语义转换),一般保存符号的两个属性:语义和标记类型。

每次从输入字符串流中接收一个字符串,默认字符串之间以空格隔开。如果该字符串为全数字标价记为digit;否则为other。

#ifndef _LEX_H#define _LEX_Htypedef enum _TOKEN{end, error, digit, other} TOKEN;//桶中每个链表节点data指向SYMBOLtypedef struct _SYMBOL{    char *lexeme;//字符串     TOKEN token;//标记 }SYMBOL;#endif
#include <stdio.h>#include <ctype.h>#include <stdlib.h>#include <string.h>#include "lex.h"#include "../Chtbl/chtbl.h"//istream为输入流, symtbl为链式哈希表 //返回插入元素的类型 TOKEN lex(const char *istream, CHTbl *symtbl){    TOKEN token;    SYMBOL *symbol;    int length, retval, i;    if((symbol = (SYMBOL *)malloc(sizeof(SYMBOL))) == NULL)        return error;    //从输入流读入一个字符串放入symbol->lexeme     if((symbol->lexeme = next_token(istream)) == NULL)    {        free(symbol);        return end;    }    length = strlen(symbol->lexeme);    //判断该字符串是不是数字     for(i = 0; i < length; i++)    {        if(!isdigit(symbol->lexeme[i]))            symbol->token = other;    }    memcpy(&token, &symbol->token, sizeof(TOKEN));    //向哈希表中插入符号 ,以结构体symbol为元素     if((retval = chtbl_insert(symtbl, symbol)) < 0)    {        free(symbol);        return error;    }    else if(retval == 1)    {        free(symbol);    }    return token;}