📄 form.cpp
字号:
//form.cpp
//标志符表的实现
#include "StdAfx.h"
#include ".\form.h"
#include "wording.h"
#include "symtax.h"
CForm::CForm(CPl0 *p)
{
pl=p;
lev=0;
tx[0]=0;
table[0].name[0]=0;
//初始化时,将表格复位
}
void CForm::Enter(enum object k) //参数:k:欲登陆到符号表的符号类型
{
if (pl->symtax->Level() > lev)
tx[++lev]=tx[lev-1];
else if (pl->symtax->Level() < lev)
lev--;
tx[lev]++; //符号表指针指向一个新的空位
if (tx[lev] >= TABLE_SIZE)
return; //符号表已装满
strcpy(table[tx[lev]].name,pl->wording->id); //name是符号的名字,对于标识符,这里就是标识符的名字
table[tx[lev]].kind=k; //符号类型,可能是常量、变量或过程名
switch (k) //根据不同的类型进行不同的操作
{
case constant: //如果是常量名
table[tx[lev]].val = pl->wording->num;
break;
case variable: //如果是变量名
table[tx[lev]].level = pl->symtax->Level();
table[tx[lev]].adr = pl->symtax->DataAddr();
break;
case procedure: //如果要登陆的是过程名
table[tx[lev]].level = pl->symtax->Level(); //记录下这个过程所在层次
break;
}
}
int CForm::Position(char *id) //返回值:要找的符号在符号表中的位置,如果找不到就返回0
{
int i=tx[lev]; //从符号表中当前位置也即最后一个符号开始找
while (stricmp(table[i].name,id) && i>0) //比较id与符号表各位置的name
i--; //找前面一个
return i; //返回找到的位置号,如果没找到则一定正好为0
}
CForm::~CForm(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -