⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symtab.c

📁 根据编译器的基本原理
💻 C
字号:
/****************************************************/
/* File: symtab.c                                   */
/* Symbol table implementation for the TINY compiler*/
/* (allows only one symbol table)                   */
/* Symbol table is implemented as a chained         */
/* hash table                                       */
/* Compiler Construction: Principles and Practice   */
/* Kenneth C. Louden                                */
/****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "symtab.h"

/* SIZE is the size of the hash table */
#define SIZE 211

/* SHIFT is the power of two used as multiplier
   in hash function  */
#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;
}

/* the list of line numbers of the source 
 * code in which a variable is referenced
 */
typedef struct LineListRec
   { int lineno;
     struct LineListRec * next;
   } * LineList;

/* The record in the bucket lists for
 * each variable, including name, 
 * assigned memory location, and
 * the list of line numbers in which
 * it appears in the source code
 */
typedef struct BucketListRec
   { char * name;
	 ExpType etype;
     LineList lines;
     int memloc ; /* memory location for variable */
     struct BucketListRec * next;
   } * BucketList;

/* the hash table */
static BucketList hashTable[SIZE];

/* Procedure st_insert inserts line numbers and
 * memory locations into the symbol table
 * loc = memory location is inserted only the
 * first time, otherwise ignored
 */
void st_insertd( char * name, int loc, ExpType t)
{ 
	int h = hash(name);
	BucketList l =  hashTable[h];
	while ((l != NULL) && (strcmp(name,l->name) != 0))
		l = l->next;
	if (l == NULL) /* variable not yet in table */
	{ 
		l = (BucketList) malloc(sizeof(struct BucketListRec));
		l->name = name;
		l->etype=t;
		l->lines = NULL;
		l->memloc = loc;
		l->next = hashTable[h];
		hashTable[h] = l; 
	}
	else /* found in table, so just add line number */
	{ 
		printf("Redefined!");
	}
} 

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) /* found in table, so just add line number */
	{ 
		if(l->lines!=NULL)
		{
			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;
		}
		else
		{
			l->lines = (LineList) malloc(sizeof(struct LineListRec));
			l->lines->lineno = lineno;
			l->lines->next = NULL;
		}
	}
}

/* Function st_lookup returns the memory 
 * location of a variable or -1 if not found
 */
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 */

ExpType getType(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 Void;
	else return l->etype;
}

⌨️ 快捷键说明

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