[自制语言 2]Simple machine语言(简单机器语) 优化和编译器进度展示


开头

这里是已经优化过的语言,没看过上期的可以去看看

关于名字

今天,我给这门语言取了个名: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一样,崩溃了!屮!

结尾

崩溃了!求求大佬优化一下代码吧!我真的不行了!写的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值