📄 symtab.c
字号:
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "symtab.h"
#define SIZE 211
#define SHIFT 4
/* the hash function */
static int hash(char * key)
{
int temp = 0;
int i=0;;
while ( key[i] != '\0')
{temp = ((temp << SHIFT) + key[i]) % SIZE;
++i;
}
return temp;
}
typedef struct LineListRec
{ int lineno;
struct LineListRec *next;
}*LineList;
typedef struct BucketListRec
{ char *name;
LineList lines;
int memloc;
struct BucketListRec *next;
} *BucketList;
static BucketList hashTable[SIZE];
void st_insert(char *name,int lineno,int loc)
{
int h=hash(name);
BucketList l=hashTable[h];
while((l!=NULL)&&(strcmp(name,l->name)!=0))
{l=l->next;}
if(l==NULL)
{ l=(BucketList)malloc(sizeof(struct BucketListRec));
l->name=name;
l->lines=(LineList)malloc(sizeof(struct LineListRec));
l->lines->lineno=lineno;
l->memloc=loc;
l->lines->next=NULL;
l->next=hashTable[h];
hashTable[h]=l;}
else
{ LineList t=l->lines;
while(t->next!=NULL) {t=t->next;}
t->next=(LineList)malloc(sizeof(struct LineListRec));
t->next->lineno=lineno;
t->next->next=NULL;
}
}//st_insert
int st_lookup(char *name)
{int h=hash(name);
BucketList l=hashTable[h];
while((l!=NULL)&&(strcmp(name,l->name)!=0))
l=l->next;
if(l==NULL) return -1;
else return l->memloc;
}
/* procedure printSymTab prints a formatted
* listing of the symbol table contents
* to the listing file
*/
void printSymTab(FILE *listing)
{
int i;
fprintf(listing,"Variable Name Location Line Numbers\n");
fprintf(listing,"----------- --------- --------\n");
for(i=0;i<SIZE;i++)
{if(hashTable[i]!=NULL)
{BucketList l=hashTable[i];
while (l!=NULL)
{LineList t=l->lines;
fprintf(listing,"%-14s",l->name);
fprintf(listing,"%-8d ",l->memloc);
while(t!=NULL)
{fprintf(listing,"%4d",t->lineno);
t=t->next;
}
fprintf(listing,"\n");
l=l->next;
}
}
}
}//printSymTab
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -