编译原理课设(NEU)代码Symbol.h
代码有几处bug,另外当时开发的时候心太急,理论基础没有做好,导致代码有不可逆性的缺陷:符号表,大家可以将符号表结构修改一下
代码是分为多个文章中存放的
VS 2017 VC++环境
代码是分为6个部分,在个人主页中都可以找到
#pragma once
#include<iostream>
#include<string>
#include<list>
using namespace std;
class Symbol_table; //符号表
class PFINL; //函数表
class RINFL; //struct 表
class typel; //数据类型表
typedef struct struct_VALL
{
int offset;//该变量相对于区头的偏移liang
string var_name;//变量名 也可以为空 用于返回值
}struct_VALL;
struct A //四元式的结构体
{
string a1, a2, a3, a4;
}typedef struct_quattro;
class LEN //长度
{
public:
int len;
};
class VALL //函数活动表 该活动表 有问题 没有偏移量 需要修正
{
public:
int this_function_return_len;//函数的返回值长度 用于后期的赋值验证合法性
int this_VALL_len;//VALL的总长度
string OLD_SP; //用于存储返回上一次的SP
int ret_exp; //函数返回值 void返回值为0
list<string> list_parameter;//形参链表
list<string> list_tmp_var;//临时变量链表
list<string> list_user_var;//临时用户链表
list<struct_VALL> member;//一个VALL中的所有变量的带有偏移量的list集合
};
class PFINL //函数表
{
public :
string type_function;
int OFF; //过函自身数据相对于区头位置偏移
int FN; //参数个数
string ENTRY;//函数入口地址
list<Symbol_table> * PARAM; //形参链表
VALL * VALL_TABLE; //VALL表
};
class _RINFL //struct 表的一行数据 用于定义 struct 类型时 不用于定义struct变量
{
public:
string MEMBER_NAME; //struct的成员名
int OFF; //相对于记录区的偏移量
typel *TP; //指针 该成员类型指针
};
class RINFL //struct 表
{
public:
list<_RINFL> list_rinfl;
};
class typel //数据类型表
{
public:
string TVAL; //类型代码 i 整型 void 空型 d结构型
RINFL *TPIONT; //根据数据类型不同,指向不同的结构体
// int void 为NULL
//类型指针 struct 数组等
};
class Symbol_table //符号表
{
public:
string NAME; //标识符名
string CAT; //类型 函数 变量 类型定义 常量
typel *TYPE; //指向类型 itp vtp 结构体 数组等 这里规定 指向结构体赋值 其余为NULL
void *ADDR; //根据情况不同 分别指向 PFINL CONS LENL 函数表 常量表 长度表
};
struct struct_tmp_offset_var
{
string var_name;
string offset;
}typedef struct_tmp_offset_var;