应用简介:哈希表会应用于编译器中,满足快速存取符号信息的需求。把源码中有组织的字符转换为有意义的字符串(语义转换),一般保存符号的两个属性:语义和标记类型。
每次从输入字符串流中接收一个字符串,默认字符串之间以空格隔开。如果该字符串为全数字标价记为digit;否则为other。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "lex.h"
#include "../Chtbl/chtbl.h"
TOKEN lex(const char *istream, CHTbl *symtbl)
{
TOKEN token;
SYMBOL *symbol;
int length, retval, i;
//为标记数据结构申请空间
if((symbol = (SYMBOL *)malloc(sizeof(SYMBOL))) == NULL)
return error;
//字符串流已经接收完,传递的是字符串首地址
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));
//如果该符号还不存在,则插入哈希表。
if((retval = chtbl_insert(symtbl, symbol)) < 0)
{
free(symbol);
return error;
}
else if(retval == 1)
{
free(symbol);
}
return token;
}