📄 table.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 + -