亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? symtab.cpp

?? 小型編譯系統的源代碼
?? CPP
字號:
#include "globals.h"
#include "symtab.h"

//the size of the hash table
const int SIZE = 17;
//the power of two used as multiplier in hash function
const int SHIFT = 4;

char * funcname = NULL;

/* 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
 */
struct LineList
{ 
        int lineno;
  struct LineList * next;
        LineList(){
                lineno = -1;
                next = NULL;
        }
};


/* 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
 */
struct BucketList
{ 
        char * name;
				LineList * lines;
				char * fname;
        entryType entrytype;
        int memloc;
        int size;
        paramType * param;
  //int memloc ; /* memory location for variable */
  struct BucketList * next;
        BucketList(){
                name = NULL;
								fname = NULL;
                lines = NULL;
                next = NULL;
                memloc = -1;
								param = NULL;
								size = 0;
        }
};

/* the hash table */
struct SymTab{
        BucketList * hashTable[SIZE];
        SymTab * child;
        SymTab * parent;
        SymTab * sibling;
        SymTab(){
                for (int i=0;i<SIZE;i++)
                        hashTable[i] = NULL;
                child = parent = sibling = NULL;
        }
};

SymTab * symtable = NULL;
SymTab * current = NULL;
SymTab * last    = NULL;

/* Procedure AllocateSym allocate space for a new SymTab 
 * and set the parent of the new table to the parameter parent
 */
SymTab * AllocateSym( SymTab * parent){
        SymTab * temps = new SymTab;
        temps->parent = parent;
        return temps;
}

/* Procedure st_insert inserts line numbers and
 * memory locations into the symbol table
 * loc = memory location is inserted only the
 * first time, otherwise ignored
 */
int st_insert( char * name, int lineno, ExpType type, ExpKind kind, int size)
{ 
        int h = hash(name);
        if (current==NULL)
                symtable = current = last = AllocateSym(NULL);
  BucketList * l =  current->hashTable[h];
  while ((l != NULL) && (strcmp(name,l->name) != 0))
    l = l->next;
  if (l == NULL) /* variable not yet in table */
  { 
                l = new BucketList;
    l->name = name;
		if (funcname == NULL){
			l->fname = new char [7];
			strcpy(l->fname, "Global");
		}
		else {
			l->fname = new char [strlen(funcname)-1];
			strcpy(l->fname, funcname);
		}
    l->lines = new LineList;
    l->lines->lineno = lineno;
    //l->memloc = loc;
    l->lines->next = NULL;
    l->next = current->hashTable[h];
    l->entrytype.type = type;
		switch (type){
			case Integer:
			case Float:
				l->size = 4;
				break;
			case Char:
				l->size = 1;
				break;
		}
    if (kind == IdK){
			l->entrytype.varK = Norm;
		}
    else if (kind == ArrayK){
			l->entrytype.varK = Array;
			l->size = l->size * size;
		}
    current->hashTable[h] = l; 
  }
  else /* found in table, so just add line number */
     return FAIL; 
  return SUCCESS;
} /* st_insert */

int st_insert( char * name, int lineno, ExpType type, TreeNode * params)
{
        int h = hash(name);
        if (current==NULL)
                symtable = current = last = AllocateSym(NULL);
  BucketList * l =  current->hashTable[h];
  while ((l != NULL) && (strcmp(name,l->name) != 0))
    l = l->next;
  if (l == NULL) /* variable not yet in table */
  { 
                l = new BucketList;
    l->name = name;
    l->lines = new LineList;
    l->lines->lineno = lineno;
    //l->memloc = loc;
    l->lines->next = NULL;
    l->next = current->hashTable[h];
    l->entrytype.type = type;
    l->entrytype.varK = Func;
		if (funcname == NULL){
			l->fname = new char [7];
			strcpy(l->fname, "Global");
		}
    paramType * head = l->param;
    for (TreeNode * tt = params; tt!=NULL; tt = tt->sibling){
      if (l->param==NULL){
        l->param = new paramType;
        l->param->next=NULL;
        head = l->param;
        l->param->type.type=tt->child[0]->attr.vartype;
			}
      else {
        l->param->next = new paramType;
				l->param=l->param->next;
        l->param->type.type=tt->child[0]->attr.vartype;
      }
			if (tt->child[1]->kind.exp == ArrayK)
        l->param->type.varK = Array;
      else l->param->type.varK = Norm;
    }  //for
    l->param = head;
		l->size = 0;
    current->hashTable[h] = l; 
        }
  else /* found in table, so just add line number */
     return FAIL; 
  return SUCCESS;
}

/* Function st_lookup returns the memory 
 * location of a variable or -1 if not found
 */
int st_lookup ( char * name , Result & result)
{ 
  int h = hash(name);
  SymTab * ts = current;
  for (;ts!=NULL;ts=ts->parent){
     BucketList * l = ts->hashTable[h];
     while ((l != NULL) && (strcmp(name,l->name) != 0))
            l = l->next;
     if (l!=NULL){
       result.etype = l->entrytype.type;
			 result.vark = l->entrytype.varK;
       if (l->entrytype.varK == Func)
         result.params = l->param;
			 result.memloc = l->memloc;
			 result.size = l->size;
       break;
     }
  }
	if (ts == symtable)result.local=false;
	else result.local=true;
	
  if (ts == NULL) return FAIL;
  else return SUCCESS;
}

int st_funclookup( char * name, ExpType type, TreeNode * params)
{
        if (symtable == NULL) return FAIL;
        int h = hash(name);
        BucketList * l = symtable->hashTable[h];
        while ((l != NULL) && (strcmp(name,l->name) != 0) )
                        l = l->next;
        if (l == NULL) return FAIL;
        else {//name found, compare the return type and parameters
                if (l->entrytype.type==type&&l->entrytype.varK==Func){
                        TreeNode * tp1;
                        paramType *tp2;
                        for (tp1=params,tp2=l->param;tp1!=NULL&&tp2!=NULL;tp1=tp1->sibling,tp2=tp2->next)
                                if (tp1->child[0]->attr.vartype!=tp2->type.type||tp1->child[1]->varK!=tp2->type.varK)
                                        break;
                        if (tp1==NULL&&tp2==NULL)return SUCCESS;
                        else return UNCONFORM;
                }
        }
				if (l->entrytype.type!=type)
					return INVALID;
        return FAIL;
}

int st_funclookup( char * name, Result & result)
{
	int h = hash(name);
  BucketList * l = symtable->hashTable[h];
  while ((l != NULL) && (strcmp(name,l->name) != 0))
     l = l->next;
  if (l!=NULL&&l->entrytype.varK==Func){
		result.params = l->param;
		result.etype = l->entrytype.type;
		result.vark = l->entrytype.varK;
		result.memloc = -1;
		result.local = false;
		result.size = 0;
	}
	else return FAIL;
	return SUCCESS;
}

/* Procedure st_setLoc  set a variable's memory location
 *
 */
int st_setLoc(char * name, int location)
{
	int h = hash(name);
  BucketList * l = current->hashTable[h];
  while ((l != NULL) && (strcmp(name,l->name) != 0))
     l = l->next;
  if (l!=NULL){
		l->memloc = location;
  }
  else return FAIL;
	return SUCCESS;
}

/* Function st_newBuck notes that the procedure enters
 * a new compoud statement
 */
void st_newBuck()
{
        if (symtable == NULL)
                symtable = current = last = AllocateSym(NULL);
        if (current == last){
        	if (current->child == NULL){
        		current->child = AllocateSym(current);
        		current = last = current->child;
        	}
        	else current = last = current->child;	
        }
        else if (last->parent == current){
        	if (last->sibling == NULL)
        		last->sibling = AllocateSym(current);
        	current = last = last->sibling;	
        }
        else {
        //error! You have met a bug of the procedure	
        }
}

/* Function st_delBuck notes that the procedure leaves
 * a compoud statement
 */
void st_delBuck()
{
        if (current->parent!= NULL){
        	if (current == last)
        		current = last->parent;
        	else if (last->parent= current){
        		current = current->parent;
        		last = last->parent;
        	}
        	else {
        	//error! You have met a bug of the procedure	
        	}
        }
}

void st_reset()
{
	current = last = symtable;
}

//Enterss a Function definition part
void st_inFunc(char * name){
	if (funcname!=NULL)delete funcname;
	funcname = new char[strlen(name)+1];
	strcpy(funcname,name);
}

//Leaves a Function definition part
void st_outFunc(){
	delete funcname;
	funcname = NULL;
}

void printSymTab(FILE * listing, SymTab * symbol)
{
	int i;
	if (symbol == NULL)return;
	for (i=0;i<SIZE;++i)
  { if (symbol->hashTable[i] != NULL)
    { BucketList *l = symbol->hashTable[i];
      while (l != NULL)
      { LineList *t = l->lines;
        fprintf(listing,"%-17s",l->name);
				//if (symbol == symtable)fprintf(listing,"Global  ");
				//else fprintf(listing,"Local   ");
				fprintf(listing,"%-14s",l->fname);
				if (l->entrytype.varK==Func){
					switch(l->entrytype.type){
					case Integer:
						fprintf(listing,"Func returns int   ");
						break;
					case Char:
						fprintf(listing,"Func returns char  ");
						break;
					case Void:
						fprintf(listing,"Func return void   ");
						break;
					}
				}
				else if (l->entrytype.varK==Array){
					switch(l->entrytype.type){
					case Integer:
						fprintf(listing,"Array of int       ");
						break;
					case Char:
						fprintf(listing,"Array of char      ");
						break;
					case Void:
						fprintf(listing,"Array of void      ");
						break;
					}
				}
				else {
					switch(l->entrytype.type){
					case Integer:
						fprintf(listing,"     int           ");
						break;
					case Char:
						fprintf(listing,"     char          ");
						break;
					case Void:
						fprintf(listing,"     void          ");
						break;
					}
				}
				fprintf(listing,"%-4d   ",l->size);
				fprintf(listing,"%-6d      ",l->memloc);
				fprintf(listing,"\n");
        l = l->next;
      }
    }
  }
	printSymTab(listing,symbol->child);
	printSymTab(listing,symbol->sibling);
}
void printSymTab(FILE * listing){
	fprintf(listing,"Variable Name        Area           Type          size    Location   \n");
	fprintf(listing,"-------------    ------------  --------------     ----   ----------  \n");
  printSymTab(listing,symtable);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区日韩| 蜜桃一区二区三区在线| 26uuu欧美| 精品国产一区二区三区久久影院| 欧美色男人天堂| 欧美嫩在线观看| 欧美高清精品3d| 日韩一区二区在线观看| 欧美高清www午色夜在线视频| 欧美精品粉嫩高潮一区二区| 7777精品伊人久久久大香线蕉完整版 | 成人午夜看片网址| 成人免费三级在线| 91老师国产黑色丝袜在线| 91九色02白丝porn| 日韩一本二本av| 久久久www成人免费毛片麻豆| 国产日韩欧美精品综合| 日韩美女视频一区| 午夜国产精品一区| 精品一区二区在线观看| 国产成人精品一区二区三区网站观看| 国产老肥熟一区二区三区| 成人av网站在线| 欧美色成人综合| 久久精品一区四区| 亚洲综合一二区| 日本美女一区二区三区| 国产成人高清视频| 欧美性受xxxx黑人xyx性爽| 在线综合视频播放| 国产精品美女久久久久久| 亚洲一区在线观看网站| 国产一二精品视频| 欧美亚洲禁片免费| 久久久久久日产精品| 亚洲免费av高清| 精一区二区三区| 色94色欧美sute亚洲13| 国产亚洲精品7777| 三级不卡在线观看| av电影在线观看一区| 欧美一二三区在线| 亚洲精品国产精品乱码不99 | 国产欧美中文在线| 午夜欧美在线一二页| www.日韩精品| 久久久久久久免费视频了| 亚洲a一区二区| jlzzjlzz亚洲日本少妇| 精品国精品自拍自在线| 亚洲狠狠爱一区二区三区| 成人一道本在线| 欧美成人福利视频| 日日摸夜夜添夜夜添精品视频| 国产很黄免费观看久久| 91精品国产入口| 亚洲午夜电影在线观看| 色欧美片视频在线观看| 国产精品沙发午睡系列990531| 日韩va欧美va亚洲va久久| 在线亚洲一区二区| 亚洲日穴在线视频| av男人天堂一区| 国产午夜精品一区二区三区视频| 免费观看在线色综合| 欧美人牲a欧美精品| 亚洲一区二区偷拍精品| 91久久人澡人人添人人爽欧美| 亚洲欧美综合另类在线卡通| 国产精品123| 久久久久久97三级| 国产麻豆视频一区二区| 久久综合一区二区| 国产一区二区女| 国产亚洲制服色| 国产精品66部| 国产精品视频看| 不卡av在线网| 亚洲另类中文字| 欧美日韩精品一区二区三区| 亚洲一区在线观看免费 | 婷婷一区二区三区| 欧美精品免费视频| 蜜臀久久99精品久久久久久9 | 欧美日韩日日骚| 日韩电影在线一区二区| 日韩精品一区二区三区中文不卡| 免费看日韩a级影片| 欧美电视剧免费全集观看 | 亚洲国产岛国毛片在线| 国产91精品免费| 一区二区三区中文字幕在线观看| 色哟哟欧美精品| 日本午夜精品一区二区三区电影| 日韩一区二区三区视频在线 | 色天使色偷偷av一区二区| 亚洲图片欧美综合| 精品国产一区a| 成人av在线影院| 亚洲在线视频一区| 欧美一级高清大全免费观看| 精品亚洲国内自在自线福利| 久久久精品日韩欧美| 色婷婷综合激情| 久久国产精品99久久久久久老狼| 国产精品家庭影院| 欧美精品日韩一本| 成人开心网精品视频| 午夜日韩在线观看| 中文av字幕一区| 久久精品亚洲精品国产欧美kt∨| 盗摄精品av一区二区三区| 一区二区三区高清| 久久久久久毛片| 欧美精品日韩一本| 色综合久久中文综合久久97| 秋霞电影一区二区| 亚洲一区在线电影| 国产精品女同互慰在线看| 51精品久久久久久久蜜臀| 成人激情图片网| 毛片一区二区三区| 亚洲图片欧美一区| 亚洲丝袜美腿综合| 国产亚洲美州欧州综合国| 欧美一级片免费看| 91成人免费在线视频| 成人午夜精品一区二区三区| 蜜桃视频一区二区三区在线观看| 亚洲免费视频中文字幕| 久久美女高清视频| 精品久久久久久久久久久久包黑料 | 91麻豆成人久久精品二区三区| 久久99热狠狠色一区二区| 亚洲高清免费视频| 亚洲精品一二三| 亚洲欧洲精品一区二区三区| 久久日韩精品一区二区五区| 69堂精品视频| 欧美日韩和欧美的一区二区| 日本大香伊一区二区三区| 91在线观看下载| 成人免费毛片aaaaa**| 国产成人免费视频一区| 国产精品自拍在线| 国产在线精品不卡| 国产一区二区不卡老阿姨| 久久电影网电视剧免费观看| 美女性感视频久久| 老司机午夜精品99久久| 福利一区二区在线观看| 福利一区二区在线| 成人免费的视频| 成人中文字幕合集| 99这里只有精品| 99天天综合性| 在线观看av不卡| 在线观看视频91| 欧美日本乱大交xxxxx| 欧美日韩中文精品| 日韩一区二区免费视频| 日韩免费一区二区三区在线播放| 欧美一区二区日韩一区二区| 欧美精品久久一区| 久久嫩草精品久久久精品| 国产亚洲精品bt天堂精选| 自拍偷拍欧美精品| 亚洲成av人片在www色猫咪| 午夜亚洲福利老司机| 极品美女销魂一区二区三区 | 中文字幕的久久| 亚洲精品成人a在线观看| 日韩黄色免费电影| 国产一区二区调教| 91视视频在线直接观看在线看网页在线看 | 国内成+人亚洲+欧美+综合在线| 国产在线看一区| 色综合久久综合| 精品免费视频.| 亚洲免费观看高清完整版在线 | 欧美精品在线一区二区三区| 精品国精品国产| 亚洲日本免费电影| 久久激情五月婷婷| 91麻豆swag| 久久婷婷综合激情| 一区二区成人在线| 狠狠狠色丁香婷婷综合激情 | 一区二区三区四区五区视频在线观看| 一区二区欧美精品| 国产一区二区三区黄视频| 欧美亚洲一区二区在线观看| 久久婷婷一区二区三区| 亚洲午夜精品在线| 成人综合婷婷国产精品久久| 欧美狂野另类xxxxoooo| 亚洲国产高清不卡| 极品少妇xxxx精品少妇| 欧美伦理视频网站|