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

📄 symtab.c

📁 bison源代码.bison 是替代yacc的语法分析程序生成器. yacc是 Yet Another Compiler Compiler的缩写. bison又是什么呐 是一个生成可以分析文本文件结构
💻 C
字号:
/* Symbol table manager for Bison,   Copyright (C) 1984, 1989 Free Software Foundation, Inc.This file is part of Bison, the GNU Compiler Compiler.Bison is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.Bison is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with Bison; see the file COPYING.  If not, write tothe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */#include <stdio.h>#include "system.h"#include "new.h"#include "symtab.h"#include "gram.h"bucket **symtab;bucket *firstsymbol;bucket *lastsymbol;inthash(key)char *key;{  register char *cp;  register int k;  cp = key;  k = 0;  while (*cp)    k = ((k << 1) ^ (*cp++)) & 0x3fff;  return (k % TABSIZE);}char *copys(s)char *s;{  register int i;  register char *cp;  register char *result;  i = 1;  for (cp = s; *cp; cp++)    i++;  result = xmalloc((unsigned int)i);  strcpy(result, s);  return (result);}voidtabinit(){/*   register int i; JF unused */  symtab = NEW2(TABSIZE, bucket *);  firstsymbol = NULL;  lastsymbol = NULL;}bucket *getsym(key)char *key;{  register int hashval;  register bucket *bp;  register int found;  hashval = hash(key);  bp = symtab[hashval];  found = 0;  while (bp != NULL && found == 0)    {      if (strcmp(key, bp->tag) == 0)	found = 1;      else	bp = bp->link;    }  if (found == 0)    {      nsyms++;      bp = NEW(bucket);      bp->link = symtab[hashval];      bp->next = NULL;      bp->tag = copys(key);      bp->class = SUNKNOWN;      if (firstsymbol == NULL)	{	  firstsymbol = bp;	  lastsymbol = bp;	}      else	{	  lastsymbol->next = bp;	  lastsymbol = bp;	}      symtab[hashval] = bp;    }  return (bp);}voidfree_symtab(){  register int i;  register bucket *bp,*bptmp;/* JF don't use ptr after free */  for (i = 0; i < TABSIZE; i++)    {      bp = symtab[i];      while (bp)	{	  bptmp = bp->link;#if 0 /* This causes crashes because one string can appear more than once.  */	  if (bp->type_name)	    FREE(bp->type_name);#endif	  FREE(bp);	  bp = bptmp;	}    }  FREE(symtab);}

⌨️ 快捷键说明

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