编译原理课设(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的地方
};