symtab.c

来自「yacc编译器」· C语言 代码 · 共 113 行

C
113
字号
/* $Id: symtab.c,v 1.4 2005/05/04 20:42:28 tom Exp $ */#include "defs.h"/* TABLE_SIZE is the number of entries in the symbol table. *//* TABLE_SIZE must be a power of two.			    */#define	TABLE_SIZE 1024static bucket **symbol_table = 0;bucket *first_symbol;bucket *last_symbol;int hash(char *name){    register char *s;    register int c, k;    assert(name && *name);    s = name;    k = *s;    while ((c = *++s) != 0)	k = (31 * k + c) & (TABLE_SIZE - 1);    return (k);}bucket *make_bucket(char *name){    register bucket *bp;    assert(name);    bp = (bucket *)MALLOC(sizeof(bucket));    if (bp == 0)	no_space();    bp->link = 0;    bp->next = 0;    bp->name = MALLOC(strlen(name) + 1);    if (bp->name == 0)	no_space();    bp->tag = 0;    bp->value = UNDEFINED;    bp->index = 0;    bp->prec = 0;    bp->class = UNKNOWN;    bp->assoc = TOKEN;    if (bp->name == 0)	no_space();    strcpy(bp->name, name);    return (bp);}bucket *lookup(char *name){    register bucket *bp, **bpp;    bpp = symbol_table + hash(name);    bp = *bpp;    while (bp)    {	if (strcmp(name, bp->name) == 0)	    return (bp);	bpp = &bp->link;	bp = *bpp;    }    *bpp = bp = make_bucket(name);    last_symbol->next = bp;    last_symbol = bp;    return (bp);}void create_symbol_table(void){    register int i;    register bucket *bp;    symbol_table = (bucket **)MALLOC(TABLE_SIZE * sizeof(bucket *));    if (symbol_table == 0)	no_space();    for (i = 0; i < TABLE_SIZE; i++)	symbol_table[i] = 0;    bp = make_bucket("error");    bp->index = 1;    bp->class = TERM;    first_symbol = bp;    last_symbol = bp;    symbol_table[hash("error")] = bp;}void free_symbol_table(void){    FREE(symbol_table);    symbol_table = 0;}void free_symbols(void){    register bucket *p, *q;    for (p = first_symbol; p; p = q)    {	q = p->next;	FREE(p);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?