目录
前言
没什么好说的,编译器差不多了,现在还差个代码编辑器,目前只能是输入完后输入over
代码重构了,后面觉得代码标记没什么用,删了
不知道为什么就是觉得没用(bushi <<这里有一段文字
代码简介
点做了一点改动(就前言说的)
然后就没什么了:
指令集:
指令 参数 说明
[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 输入一个数字并保存至存储单元X
Cin: X 输入一个字符并以ASCLL码的形式转换成数字保存至存储单元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.对于不存在的指令,我们无视处理;
2.对于不存在的存储,我们将其视为数值0或者将其视为1号单元处理;
3.参数表中每一个参数都要用一个减号(-)来分隔;
编译器
重构了,就这样,也没啥好说的了 不是你TM搁着水是吧?
#include<iostream>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
string Code[100001]; //酷酷的代码集
string Slist[10]={"mov","jump","epual","Nout","Cout","Nin","Cin","end"},Tlist[10]={"set","add","cut","rid","exp","sqrt","pow","and","or","xor"}; //酷酷的运算码设置
int len,S_unit[30],Q; //len 代码条数, a 存储单位
bool EXIT=false;
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
void ERROR(string s,string code) //一点也不酷的报错函数
{
cout<<"代码错误\n";
cout<<" 错误类型:"<<s<<endl;
cout<<" 错误代码:"<<code<<endl;
//报错代码
EXIT=true;
}
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
int Get_unit(string code,int &i)
{
int P=i,n=0;
if(code[P]=='[')
//单元数据 情况下
{
P++;
if(code[P]>='0'&&code[P]<='9')
//单元 以数字形式展现
{
while(code[P]!=']')
{
if(code[P]>='0'&&code[P]<='9')
{
n+=n*10+(code[P]-'0');
}
else
{
ERROR("存储单元参数填写错误",code);
}
P++;
}
}
else if(code[P]>='a'&&code[P]<='z')
//单元 以字母形式展现
{
n=code[P]-'a';
}
else if(code[P]=='Q')
//单元 以常量Q形式展现
{
n=Q;
}
else
{
ERROR("存储单元参数填写错误",code);
}
n=S_unit[n];
}
else if(code[P]>='0'&&code[P]<='9')
//数字数据 情况下
{
while((code[P]>='0'&&code[P]<='9')||code[P]==' ')
{
if(code[P]>='0'&&code[P]<='9')
{
n+=n*10+(code[P]-'0');
P++;
}
else if(code[P]!=' ')
{
ERROR("存储单元参数填写错误",code);
}
}
}
else if(code[P]>='a'&&code[P]<='z')
//字母数据 情况下
{
n=code[P]-'a';
}
else if(code[P]=='Q')
//单元 以常量Q形式展现
{
n=Q;
}
else
{
ERROR("存储单元参数填写错误",code);
}
i=P+1;
return n;
}
int Get_data(string code,int &i)
{
int P=i,n=0;
while(code[P]==' ')
{
P++;
}
if(code[P]=='[')
//单元数据 情况下
{
P++;
if(code[P]>='0'&&code[P]<='9')
//单元 以数字形式展现
{
while(code[P]!=']')
{
if(code[P]>='0'&&code[P]<='9')
{
n+=n*10+(code[P]-'0');
}
else
{
ERROR("数据参数填写错误",code);
}
P++;
}
}
else if(code[P]>='a'&&code[P]<='z')
//单元 以字母形式展现
{
n=code[P]-'a';
}
else if(code[P]=='Q')
//单元 以常量Q形式展现
{
n=Q;
}
else
{
ERROR("数据参数填写错误",code);
}
n=S_unit[n];
}
else if(code[P]>='0'&&code[P]<='9')
//数字数据 情况下
{
while((code[P]>='0'&&code[P]<='9')||code[P]==' ')
{
if(code[P]>='0'&&code[P]<='9')
{
n=n*10+(code[P]-'0');
P++;
}
else if(code[P]!=' ')
{
ERROR("数据参数填写错误",code);
}
}
}
else if(code[P]=='Q')
//单元 以常量Q形式展现
{
n=Q;
}
else
{
ERROR("数据参数填写错误",code);
}
i=P+1;
return n;
}
/*酷酷的数据获取函数*/
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
void coder_Acode(int &L) //酷酷的单行代码运行函数定义
{
int l=L,P=0;
string code=Code[l]+";",S="",T;int X,Y;
//设置酷酷的代码
while(code[P]!=':' && code[P]!=';')
{
if(code[P]!=' ')
{
S=S+code[P];
}
P++;
}
P++;
//获取酷酷的 指令类型_S
int SC=-1;
for(int i=0;i<8;i++)
{
SC=(Slist[i]==S?i:SC);
}
//获取酷酷的 指令编号_SC
switch(SC)
{
case 0: //若果是 [指令编号_0] 是酷酷的赋值指令(mov),就执行酷酷的赋值代码
while(code[P]==' ')
{
P++;
}
while(code[P]!='-')
{
T+=code[P];
P++;
}
//获取酷酷的 赋值方式_T
P++;
int TC;
TC=-1;
X=Get_unit(code,P);
Y=Get_data(code,P);
for(int i=0;i<10;i++)
{
TC=(Tlist[i]==T?i:TC);
}
switch(TC)
{
case 0:
S_unit[X]=Y;
break;
case 1:
S_unit[X]+=Y;
break;
case 2:
S_unit[X]-=Y;
break;
case 3:
S_unit[X]*=Y;
break;
case 4:
S_unit[X]/=Y;
break;
case 5:
S_unit[X]=sqrt(S_unit[X]);
break;
case 6:
S_unit[X]=pow(S_unit[X],Y);
break;
case 7:
S_unit[X]&=Y;
break;
case 8:
S_unit[X]|=Y;
break;
case 9:
S_unit[X]^=Y;
break;
case -1:
S_unit[X]+=Y;
}
break;
case 1: //若果是 [指令编号_0] 是酷酷的跳转指令(jump),就执行酷酷的跳跃代码
X=Get_data(code,P);
//获取酷酷的 跳转位置_X
if(X<len)
{
L=X;
//酷酷的跳转
}
else
{
ERROR("jump指令跳出代码长度",code);
}
break;
case 2:
X=Get_unit(code,P);
Y=Get_data(code,P);
if(S_unit[X]==0)
{
if(Y<=len)
{
L=Y-1;
}
else
{
ERROR("jump指令跳出代码长度",code);
}
}
break;
case 3:
X=Get_unit(code,P);
cout<<S_unit[X];
break;
case 4:
X=Get_unit(code,P);
cout<<char(S_unit[X]);
break;
case 5:
X=Get_unit(code,P);
cin>>S_unit[X];
break;
case 6:
char C;
X=Get_unit(code,P);
cin>>C;
S_unit[X]=int(C);
break;
case 7:
break;
case 8:
break;
case 9:
EXIT=true;
break;
}
}
void coder()
{
caocao:
for(Q=0;Q<len&&!EXIT;Q++)
{
coder_Acode(Q);
}
}
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
int main()
{
while(true)
{
string s;
getline(cin,s);
if(s=="over")
{
break;
}
else
{
Code[len]=s;
len++;
}
}
coder();
cout<<"\nEND";
}
实例代码
mov:set-0-70; 字母F
Cout:0; 输出
mov:set-0-85; 字母U
Cout:0; 输出
mov:set-0-67; 字母C
Cout:0; 输出
mov:set-0-75; 字母K
Cout:0; 输出
over
没了
没了
没了
没了
没了
没了