Win32 Console下C++实现的PL/0语言编译程序

源代码在线查看: table.cpp

软件大小: 356 K
上传用户: gdmichael
关键词: Console Win 32 PL
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*
				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;
				}			

相关资源