小型Basic编译器问题

Posted 随风浪子~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小型Basic编译器问题相关的知识,希望对你有一定的参考价值。

# include <stdio.h>
# include <string.h>
# include <ctype.h>
# include <stdlib.h>
# include <map>
//使用map解决一对一 的关系
using namespace std;
map<char,long> mapdata;

//数据存储
typedef struct node
{
	long num;
	char ch1[20];
	char ch2[20];
}LINK;
LINK arry[101];

//存储已定义的变量
struct data
{
	char st[100];
	int top;
}p;

int main()
{
	long a,i=0,length,temp;
	char str1[20],str2[20];
	char ch;
	long k,t;
	char temp1[20];

	//数据输入
	while(scanf("%ld",&a) != EOF)
	{
		
		arry[i].num=a;
		scanf("%s",&str1);
		strcpy(arry[i].ch1,str1);
		if(strcmp(str1,"STOP") != 0)
		{
			scanf("%s",&str2);
			strcpy(arry[i].ch2,str2);
		}
		i++;
	}

	//inital
	length=i;
	p.top=0;

	//对每一条语句顺序执行
	for(i=0;i<=length;)
	{
		temp=0; //标记变量有没有定义

		//LET语句
		if(strcmp(arry[i].ch1,"LET") == 0)
		{

			ch=arry[i].ch2[0]; //取得变量
			for(k=0;k<p.top;k++)
			{
				if(p.st[k]==ch)
				{
					temp=1; //变量已定义
					if(isdigit(arry[i].ch2[2]) || arry[i].ch2[2]==‘-‘)//如果第单个是数字,则说明是常量。
					{
						for(t=0;t<strlen(arry[i].ch2)-2;t++)
							temp1[t]=arry[i].ch2[t+2];
						temp1[t]=‘\0‘;				

						mapdata[arry[i].ch2[0]]=atoi(temp1);
					}
					else
					{
						if(arry[i].ch2[3] == ‘+‘)
						{
							mapdata[arry[i].ch2[0]]=mapdata[arry[i].ch2[2]]+mapdata[arry[i].ch2[4]];
						}
						if(arry[i].ch2[3] == ‘>‘)
						{
							if(mapdata[arry[i].ch2[2]] > mapdata[arry[i].ch2[4]])
								mapdata[arry[i].ch2[0]]=1;
							else
								mapdata[arry[i].ch2[0]]=0;
						}
						break;
					}
				}
		
			}
			
			if(temp == 0) //变量未定义
			{
				if(isdigit(arry[i].ch2[2]) || arry[i].ch2[2]==‘-‘)//如果第单个是数字,则说明是常量。
				{
					p.st[p.top++]=arry[i].ch2[0];

					for(t=0;t<strlen(arry[i].ch2)-2;t++)
						temp1[t]=arry[i].ch2[t+2];
					temp1[t]=‘\0‘;

					mapdata[arry[i].ch2[0]]=atoi(temp1);

					
					
				}
				else
				{
					p.st[p.top++]=arry[i].ch2[0];
					if(arry[i].ch2[3] == ‘+‘)
					{
						mapdata[arry[i].ch2[0]]=mapdata[arry[i].ch2[2]]+mapdata[arry[i].ch2[4]];
					}
					else if(arry[i].ch2[3] == ‘>‘)
					{
						if(mapdata[arry[i].ch2[2]] > mapdata[arry[i].ch2[4]])
							mapdata[arry[i].ch2[0]]=1;
						else
							mapdata[arry[i].ch2[0]]=0;
					}
					
				}
			}
			i++;
		}


		//PRINT语句
		if(strcmp(arry[i].ch1,"PRINT") == 0)
		{
			printf("%c=%d\n",arry[i].ch2[0],mapdata[arry[i].ch2[0]]);
			i++;
		}


		//IF语句
		if(strcmp(arry[i].ch1,"IF") == 0)
		{
			if(mapdata[arry[i].ch2[0]] <= mapdata[arry[i].ch2[2]])
				i++;
			i++;
		}
		
		//GOTO语句
		if(strcmp(arry[i].ch1,"GOTO") == 0)
		{
			int b;
			b=atol(arry[i].ch2);
			i=b-1;
		}
		
		//STOP语句
		if(strcmp(arry[i].ch1,"STOP") == 0)
			break;
	}
	

	/*
	//测试是否输入成功
	for(i=0;i<=length;i++)
	{
		printf("%d %s %s\n",arry[i].num,arry[i].ch1,arry[i].ch2);
	}
	*/
	return 0;
}

 

以上是关于小型Basic编译器问题的主要内容,如果未能解决你的问题,请参考以下文章

PAT Basic 1049

无法编译此Visual Basic程序

活学活用,webapi HTTPBasicAuthorize搭建小型云应用的实践

是否可以动态编译和执行 C# 代码片段?

Golang basic_leamingM 2023 1

片段 MyFragment 未附加到 Activity