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

📄 main.cpp

📁 一个类c语言的解释器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			eip++;
			data_type d_eip;
			d_eip.type = 0;
			d_eip.value.ivalue = eip;
			dataStack->push_back(d_eip);
			//保存参数
			while(!args.empty()){
				dataStack->push_back(args.top());
				args.pop();
			}
			eip = address;
		}
		else if (temp=="LIT")
		{
			int k = code.find_first_of(' ',i+1);
			int type=atoi(code.substr(i,k-i).c_str());
			data_type d;
			d.type = type;
			if (type==0)
			{
				string s = code.substr(k+1,code.size()-k-1);
				d.value.ivalue =atoi(code.substr(k+1,code.size()-k-1).c_str());
			}
			else{
				d.value.fvalue = atof(code.substr(k+1,code.size()-k-1).c_str());
			}
			dataStack->push_back(d);
			eip++;
		}
		else if (temp=="IN")
		{
			int type=atoi(code.substr(i,code.size()-i).c_str());
			data_type d;
			d.type = type;
			if (type==0)
			{
				int iv;
				cin>>iv;
				cout<<endl;
				d.value.ivalue=iv;
			}
			else{
				float fv;
				cin>>fv;
				cout<<endl;
				d.value.fvalue==fv;
			}
			dataStack->push_back(d);
			eip++;
		}
		else if (temp=="OPR")
		{
			int op = atoi(code.substr(i,code.size()-i).c_str());
			data_type d2 = dataStack->at(dataStack->size()-1);
			dataStack->pop_back();
			data_type d1 = dataStack->at(dataStack->size()-1);
			dataStack->pop_back();
			data_type d3;
			d3.type = d1.type||d2.type;
			switch(op)
			{
				case 0:			
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue+d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.ivalue+d2.value.fvalue;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.fvalue = d1.value.fvalue+d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.fvalue+d2.value.fvalue;
						}
					}
					break;
				case 1:
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue-d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.ivalue-d2.value.fvalue;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.fvalue = d1.value.fvalue-d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.fvalue-d2.value.fvalue;
						}
					}
					break;
				case 2:
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue*d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.ivalue*d2.value.fvalue;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.fvalue = d1.value.fvalue*d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.fvalue*d2.value.fvalue;
						}
					}
					break;
				case 3:
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue/d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.ivalue/d2.value.fvalue;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.fvalue = d1.value.fvalue/d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.fvalue = d1.value.fvalue/d2.value.fvalue;
						}
					}
					break;
				case 4:
					d3.type=0;
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue<d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = d1.value.ivalue<d2.value.fvalue;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.fvalue<d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = d1.value.fvalue<d2.value.fvalue;
						}
					}
					break;
				case 5:
					d3.type=0;
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue>d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = d1.value.ivalue>d2.value.fvalue;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.fvalue>d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = d1.value.fvalue>d2.value.fvalue;
						}
					}
					break;
				case 6:
					d3.type=0;
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue==d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = 0;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.ivalue = 0;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = d1.value.fvalue==d2.value.fvalue;
						}
					}
					break;
				case 7:
					d3.type=0;
					if (d1.type==0)
					{
						if (d2.type==0)
						{
							d3.value.ivalue = d1.value.ivalue!=d2.value.ivalue;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = 1;
						}
					}
					else{
						if (d2.type==0)
						{
							d3.value.ivalue = 1;
						}
						else if (d2.type==1)
						{
							d3.value.ivalue = d1.value.fvalue!=d2.value.fvalue;
						}
					}
					break;
			}
			dataStack->push_back(d3);
			eip++;
		}
	}
}

//定义全局数据
void global_allocate(string line){
	//中间代码错误,直接返回
	if (line.at(0)!='R'&&line.at(0)!='I')
	{
		return;
	}
	//查找第一个空格的位置,空格之前为定义变量的类型,空格之后为大小
	int i = line.find_first_of(' ');
	//默认类型为int型
	int type = 0;
	//如果以R开头,则是定义real型的变量,类型为1
	if (line.at(0)=='R')
	{
		type=1;
	}
	//定义一个数据项
	data_type d;
	//设置数据项的类型
	d.type = type;
	//获取定义变量的数量
	int count = atoi(line.substr(i+1,line.size()-i-1).c_str());
	//向数据栈中插入项
	for(int i=0;i<count;i++)
		dataStack->push_back(d);
}

int main(int argc, char *argv[]){
	if (argc<2)
	{
		cout<<"请输入文件名"<<endl;
		exit(1);
	}
	ifstream ifs(argv[1]);
	//ifstream ifs("c:\\test.cmm.cmmo");

	//初始化代码栈
	codeStack = new vector<string>;
	//初始化数据栈
	dataStack = new vector<data_type>;
	//保存读取的一条指令
	string line = "";
	//全局数据分配
	while (getline(ifs,line))
	{
		//读取到.data,全局数据定义开始
		if (line==".data")
		{
			continue;
		}
		//读取到.global_init,全局数据定义结束
		if (line==".global_init")
		{
			break;
		}
		//解释一条全局定义语句
		global_allocate(line);
	}
	//全局数据初始化
	while (getline(ifs,line))
	{
		//如果读到.data,全局数据初始化结束,结束循环
		if (line == ".code")
		{
			break;
		}
		//把全局数据初始化放到代码栈中
		codeStack->push_back(line);
		//设置全局代码初始化的长度
		init_length++;
	}
	//代码
	while (getline(ifs,line))
	{
		//把代码放到代码栈中
		codeStack->push_back(line);
	}
	//设置eip
	//因为在解释的时候,函数定义的第一句代码的地址为0,而现在代码栈里面包含全局数据声明和函数定义,解释的时候应从
	//全局数据初始化开始
	eip = -init_length;
	while (true)
	{
		//解释一条代码
		execute();
	}
	system("pause");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -