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

📄 form.cpp

📁 PL/0编译器
💻 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 + -