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

📄 table.cpp

📁 Win32 Console下C++实现的PL/0语言编译程序
💻 CPP
字号:
/*
FileName:		table.cpp
Author:			LiWen
Create:			2005-12-17
Last Modified:	2005-12-24
Discription:	符号表管理模块
*/
#include "compiler.h"

///////////////////////////////////////////////////////////////////////////////////
//符号表管理采取栈式结构,即每分析一层时,表内存储的是该层和其外层的符号
//信息,当分析完一层时,将此层的信息全部出栈,这要求在语法语义分析时,要
//按层载入符号表,且外先内后;而PL/0语言的特性,以及语法语义分析时采取的
//递归子程序调用法保证了这一点,故在表格管理中并未对载入顺序检测
//table表的开始从下标1开始,这是为了在查找时无效返回0;当然也可以返回-1,
//但为了和TMNT信号分开,此处如此解决
//

int tx;					//符号表指针
extern char word[];		//词法分析中的当前表示符
extern int num;			//词法分析中的当前数字值
TABLE table[MAXTX];		//符号表

/*=========================================================
函数:tableinit
参数:无
描述:符号表模块的初始化
返回:无
==========================================================*/
void tableinit(){
	tx = 0;
}

/*=========================================================
函数:tableinsert
参数:当前层,词类型,偏移量指针(默认NULL,var !NULl)
描述:用于语法语义分析调用,负责将标识符记入符号表,记入的信息
      包括 层数、类型、标识符名、地址(var)
返回:当前tx
==========================================================*/
int tableinsert(int lev,KIND kind,int *pdx/*=NULL for !var*/){
	tx ++;
	strcpy(table[tx].name,word);
	table[tx].kind = kind;
	switch(kind){
	case cst:
		table[tx].val = num;
		break;
	case var:
		table[tx].lev = lev;
		table[tx].addr = (*pdx)++;
		break;
	case proc:
		table[tx].lev = lev;
		break;
	}
	return tx;
}

/*=========================================================
函数:tablepop
参数:需要弹出的大小
描述:符号表出栈操作,当符号表某一层分析完毕,弹出该层符号
返回:当前tx
==========================================================*/
int tablepop(int num){
	tx -= num;
	return tx;
}

/*=========================================================
函数:tablesearch
参数:标识符名
描述:根据标识符名顺序查找其在表中位置,由于符号表的栈式管理
	  查找时采取自栈顶向底的方式,内层优先,解决了标识符的可
	  见性问题
返回:找到返回位置,否则0
==========================================================*/
int tablesearch(char *name){
	for(int i=tx;i>0;i--){
		if(strcmp(table[i].name,name)==0)
			return i;
	}
	return 0;
}

⌨️ 快捷键说明

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