📄 main.cpp
字号:
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 + -