开头
这里是已经优化过的语言,没看过上期的可以去看看
关于名字
今天,我给这门语言取了个名:Simple machine(简单机器语)
没错,我们取名就那么随便
毕竟它这个机器码本来就十分的简单
当然,如果大家有什么好的名字可以告诉我
关于语言优化
这里我加固了一些功能,同时我发现这个语言并没有输入的交互功能,于是我有加上了
更新后的语言如下:
指令集:
指令 参数 说明
[X] 返回第X位的储存单元的值或其他变量X
mov: T-X-Y 以Y为参数的T形式操作存储单元X
jump: X 跳转到第X行指令
epual: X-Y 若X等于0,执行第Y行的指令
Nout: X 以数字形式输出存储单元X
Cout: X 以字符形式输出存储单元X
Nin: X 以输入一个字符并以数字
sign: X-Y 设置标记X为第Y行的指令(参数也将一同载入)
ena: X 启用X标记的指令
end; 结束系统变量:
Q 当前指令行
A or B or C 标记存储变量
1-26 存储单元
a-z 同上,并且以a=1,b=2,c=3...y=25,z=26的形式对应(大小写敏感)具体格式:
一般指令
指令:参数表;
存储单元调用指令:
[存储编号]
结束指令
end;(照抄就行)参数T的可选项:
0 set 赋值 X=Y
1 add 加 X=X+Y
2 cut 减 X=X-Y
3 rid 乘 X=X*Y
4 exp 除 X=X/Y
5 sqrt开方(向下取整) X=sqrt(Y)
6 pow 开方 X=pow(X,Y)
7 and 逻辑与 X=X|Y
8 or 逻辑或 X=X&Y
9 xor 逻辑异或 X=X^Y
(若都不是默认为加)注意事项:
1.对于不存在的指令,我们以结束语句(end)来处理;
2.对于不存在的存储,我们将其视为数值0或者将其视为1号单元处理;
3.参数表中每一个参数都要用一个减号(-)来分隔;
若还有漏洞还请个位大佬们指出
编译器当前进度
我蚌埠住了呀!不想写了!人快没了!
#include<iostream>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
string code[100001];
string Tlist[10]={"set","add","cut","rid","exp","sqrt","pow","and","or","xor"};
int len_y,a[30],q=0; //len_y,a[30] 存储单位;
//错误函数
void code_error(int y,string s)
{
system("color 4");
cout<<"错误:位于代码的第"<<y<<"行\n";
cout<<"原因:"<<s;
cout<<"错误代码:"<<code[y]<<endl;
return;
}
//单行运行函数 ↓
bool coder_Y(int &y)
{
string s="";
int i=0,l=code[y].size();
while(code[y][i]!=':' && code[y][i]!=';')
{
s=s+code[y][i];
i++;
if(i>l-1)
{
code_error(y,"可能因代码段格式错误或不完整导致\n");
return true;
}
}
//while读入语句类型s
i++;
int X=0,Y=0;
//X,Y输入参数
//mov 存储 ↓
if(s=="mov")
{
string T;
while(code[y][i]!='-')
{
if(code[y][i]!=' ')
T+=code[y][i];
i++;
if(i>l-1)
{
code_error(y,"可能因代码段格式错误或不完整导致\n");
return true;
}
}
//获取存储方式 T
i++;
if(code[y][i]>='0' && code[y][i]<='9')
{
while(code[y][i]!='-')
{
if(i>l-1)
{
code_error(y,"可能因代码段格式错误或不完整导致\n");
return true;
}
if(code[y][i]>='0'&&code[y][i]<='9')
{
X=X*10+(code[y][i]-'0');
}
else if(code[y][i]!=' ')
{
code_error(y,"参数错误\n");
return true;
}
i+=2;
}
//数字情况下
}
else
{
if(code[y][i]>='a' && code[y][i]<='z')
{
X=code[y][i]-'a'+1;
}
else
{
code_error(y,"参数错误\n");
return true;
}
if(code[y][i+1]!='-')
{
code_error(y,"可能因代码段格式错误或不完整导致\n");
return true;
}
i+=2;
}
//获取存储单元X
if(code[y][i]=='[')
{
i++;
if(code[y][i]>='a' && code[y][i]<='z')
{
Y=code[y][i]-'a';
}
}
while(code[y][i]!=';')
{
if(i>l-1)
{
code_error(y,"可能因代码段格式错误或不完整导致\n");
return true;
}
if(code[y][i]>='0'&&code[y][i]<='9')
{
Y=Y*10+(code[y][i]-'0');
}
else if(code[y][i]!=' ')
{
code_error(y,"参数错误\n");
return true;
}
i++;
}
//获取量Y
int XX=-1;
for(int i=0;i<10;i++)
{
if(T==Tlist[i])
{
XX=i;break;
}
}
//mov代码执行代码执行
switch(XX)
{
case -1:
a[X]+=Y;
break;
case 0:
a[X]=Y;
break;
case 1:
a[X]+=Y;
break;
case 2:
a[X]-=Y;
break;
case 3:
a[X]*=Y;
break;
case 4:
a[X]/=Y;
break;
case 5:
a[X]=sqrt(Y);
break;
case 6:
a[X]=pow(a[X],Y);
break;
case 7:
a[X]|=Y;
break;
case 8:
a[X]&=Y;
break;
case 9:
a[X]^=Y;
break;
}
return false;
}
else if(s=="jump")
{
}
else if(s=="epual")
{
}
else if(s=="Nout")
{
if(code[y][i]!='[')
{
while(true)
{
if(i>l-1)
{
code_error(y,"可能因代码段格式错误或不完整导致\n");
return true;
}
if(code[y][i]>='0'&&code[y][i]<='9')
{
Y=Y*10+(code[y][i]-'0');
}
else if(code[y][i]!=' ')
{
code_error(y,"参数错误\n");
return true;
}
i++;
}
}
else if(code[y][i]=='[')
{
if()
}
}
else if(s=="Cout")
{
}
else if(s=="Nin")
{
}
else if(s=="Cin")
{
}
else if(s=="sign")
{
}
else if(s=="ena")
{
}
else if(s=="end")
{
}
else
{
}
}
void coder()
{
for(int i=1;i<=len_y;i++)
{
if(coder_Y(i))return;
}
}
int main()
{
while(true)
{
string s;
getline(cin,s);
if(s.size()==1&&s[0]=='Z')
{
break;
}
else
{
len_y++;
code[len_y]=s;
}
}
coder();
}
这个代码还不完整,还有好多没写,还写的跟个shi一样,崩溃了!屮!
结尾
崩溃了!求求大佬优化一下代码吧!我真的不行了!写的