算法精解----10、链式哈希表的应用-符号表

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

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

#ifndef _LEX_H
#define _LEX_H
typedef enum _TOKEN{end, error, digit, other} TOKEN;

//桶中每个链表节点data指向SYMBOL
typedef 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值