编译原理课设(NEU)代码exe2.h

代码有几处bug,另外当时开发的时候心太急,理论基础没有做好,导致代码有不可逆性的缺陷:符号表,大家可以将符号表结构修改一下
代码是分为多个文章中存放的
VS 2017 VC++环境
代码是分为6个部分,在个人主页中都可以找到

#pragma once
#include"Symbol_table.h"
#include<vector>
#include<iostream>
#include <string>
#include<map>
#include<list>
using namespace std;

struct name_type 
{
	string name, type;
}typedef struct_name_type;

class exe2
{
private:

	map<string, string> Key_word_table;//关键字表	先期规定
	map<string, string> Bound_table;//界符表  先期规定
	list<string> list_number;//常数链表

	vector<string> vector_type_struct;		//定义生成的struct 类型
	vector<string> vector_var;				//生成的所有变量表  包括struct和int  但不包括函数
	vector<string> vector_Function;		//生成的函数表	
	

	list<string> list_opt;		//生成计算四元式的操作符栈
	vector<string> vector_identify;		//用于生成四元式 标识符表  
	vector<struct A> quattro;		//生成的四元式链表表 传给下一级

	vector<string> x;//来自词法扫描器
	bool flag_log_opt;
	vector<string>::size_type cur_index;
	string  string_tmp_var;//用于生成临时变量名称前缀
	int int_tmp_var;
	string get_tmp_var();//获取一个不重复的临时变量

	//bool flag_struct = false;
	bool flag_function_return_void;//用来标记函数返回值 是否为空

	bool flag_struct_define;//在定义变量类型时  表明当前声明的变量在struct内
	int struct_off;	//用于在结构表中填充 偏移量

	RINFL * common_RINFL;  //用于在定义struct时作为在各个函数间传递数据

	bool flag_function_define;//函数定义标志
	int function_vall_off;		//vall的偏移量
	int function_para_number;	//函数形参个数
	PFINL * common_PFINL;	//用于在定义Function时 在各个函数间传递数据
	VALL *common_VALL;	//用于在定义Function时 在各个函数之间传递VALL表  这个VALL是一个逻辑层的  可能需要转换

	list<Symbol_table> * common_list_param;//用于在定义Function时 在各个函数之间传递形参表

	list<struct_name_type> list_struct_name_type;//用于结构体查询

	Symbol_table span_between_define_var_and_suffix_tmp_token;//这个变量是我炸毛时写的  目的时为了在定义变量后继时 由,分割的  直接赋值  这样好像还快点
	int get_struct_len(string name);//获取name struct 的长度
	int common_struct_off;//用于在type struct 和 type struct suffix 之间传递 偏移量

	int sum_function_para;//function形参总数

	void change_VALL();//修改形式VALL  变为 真正带有偏移量的VALL

	bool local_var;//局部变量标识

	bool has_main;//是否有main函数标志
	int actual_param_now;//表示当前到第几个实参赋值
	list< LEN *> delete_LEN;
	list<VALL *>delete_VALL;
	list< PFINL*>delete_PFINL;
	list< _RINFL*> delete__RINFL;
	list< RINFL*> delete_RINFL;
	list< typel*> delete_typel;
	list< Symbol_table*> delete_Symbol_table;
	list< list<Symbol_table> * >delete_list_Symbol_table;
	
	int len_show_kongge;//用来美观显示
	string show_kongge();//用来美观显示

	bool flag_param_unqiue;

	string get_type_by_name(string name);//通过变量名  获取 struct 类型

	list<struct_tmp_offset_var> list_tmp_var_offset;

	string if_is_cahe_struct_var(string var_name);//查表  是否是一个struct的list缓冲值  并返回偏移值  或空

	int int_produce_a_label;//生成一个汇编代码中的标签
	string produce_a_label();//生成一个汇编代码中的标签
	
	string use_function_name;

	list<string> list_VALL_len;

	bool flag_use_function;//
	int glen_et_function_return_tmp;
	string get_function_return_tmp();
public:
	int get_data_len(string name);//获取数据长度

	list<struct_quattro> list_quattro;
	void show_VALL();//显示函数的VALL

	void delete_new_object();
	vector<string>::size_type last_index;	//token下标

	list< Symbol_table> list_symbol;//符号表  list
	int find_list_symbol_name(string nanme);//查找变量名  用于查重

	void show_Symbol(list<Symbol_table> x);//显示符号表

	void get_const_number(list<string> x);//获取常数表

	//list<void *> //;//所有用new开辟的内存指向的对象   在最后需要注销
	void show_quattro();

	exe2();
	exe2(vector<string> x,list<string> number);
	~exe2();
	bool is_if_i(string name); //判断是否是一个标识符
	bool is_if_num(string name);//判断是否是一个数字
	bool is_if_function(string name);//判断是否是一个函数


	int Programmer();//<程序>
	
	int Function();//<函数>
	int Type_struct();//<自定义数据>
	int Define_var();//<定义变量>
	int Define_var_Suffix();//<定义变量后缀>
	int Kind_var();//<数据类型>
	int Formal_parameter();//<形参表>
	int Formal_parameter_suffix();//<实参表>
	int Actual_parameter();//<函数实参>
	int Actual_parameter_suffix();//<函数实参后缀>
	int Complex_expression();//<复杂表达式>
	int Identifier();//<标识符>
	int Struct_member_suffix();	//struct成员后继
	int real_type_suffix();

	int if_expression();//<if表达式>
	int if_execute();	//<if执行体>
	int if_execute_suffix();	//<if执行体后缀>
	int while_expression();//<while表达式>
	int while_execute();//<while执行体>
	int return_express();//<return表达式>
	int Operational_expression();//<常规运算表达式>

	int Logical_judgement();

	//一下都是运算式的递归调用
	int A();
	int A1();
	int B();
	int B1();
	int C();
	int C1();
	int D();
	int D1();
	int E();
	int E1();
	int F();
	int F1();
	int G();
	int G1();
	int H();

	void increase_cur_index();


	list<list<string> > SUM_CODE; //所有的代码
	list<string> list_Function_code;//函数体内的代码
	
	list<string> list_DSEG;//汇编数据段
	list<string> list_CSEG;//汇编代码段

	list<Symbol_table>::iterator find_name(string name);
	bool if_exist_name(string name);

	void show_list_DSEG();
	void show_list_CSEG();
	list<string> list_ASSEMBLY;//生成的汇编码
	list<Symbol_table> * list_Symbol_table;//符号表链表  以指针存在

	void start();
	void Function_execute(list<struct_quattro>::iterator *l_i, string Function_name);//函数内执行体

	bool if_is_Gobal_var(string var_name,string Function_name);//判断是全局变量还是局部变量

	int get_VALL_off(string Function_name, string var_name);//获取 某函数 其中的 某变量 的偏移量

	void ASEEM_execute(list<struct_quattro>::iterator *l_i, string Function_name);//执行体四元式转化为汇编

	int get_member_offset_by_name(string struct_type_name,string var_name);//通过名字在struct获取相对于 结构体的偏移量

	list< list<string>::iterator > list_wait_label;//需要反填label的地方
};