简单机器语(Simple machine) 编译器基本完成

目录

前言

代码简介

编译器

实例代码

没了

        没了

                没了

                没了

        没了 

                没了

                没了


前言

        没什么好说的,编译器差不多了,现在还差个代码编辑器,目前只能是输入完后输入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

没了

        没了

                没了

                没了

        没了 

                没了

                

                没了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值