# 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编译器问题的更多相关文章

  1. DotNet 资源大全中文版,内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等

    DotNet 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器. ...

  2. 【转】自己动手写SC语言编译器

    自序 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设 计大师都是编译领域的高手,像写出BASIC语言的BIL ...

  3. .NET 编译器(”Roslyn“)介绍

    介绍 一般来说,编译器是一个黑箱,源代码从一端进入,然后箱子中发生一些奇妙的变化,最后从另一端出来目标文件或程序集.编译器施展它们的魔法,它们必须对所处理的代码进行深入的理解,不过相关知识不是每个人都 ...

  4. 微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn【转】

    基金会初始董事包括 Mono 项目和 Xamarin 的老大 Miguel de Icaza,微软 .NET 团队代表和微软开放技术公司(这是微软专门为开源和开放技术.标准化成立的独立公司)代表. 首 ...

  5. 揭示编译器API

    编译器管道功能区 .NET编译器平台(“Roslyn”)通过提供一个API层,是一个传统编译器管道镜像,向你这样的消费者揭示了C#和Visual Basic编译器的代码分析. 这条管道的每一部分,现在 ...

  6. DotNet 资源大全

    awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. https://github.com/jobb ...

  7. 《.NET开发资源大全》

    目录 API 应用框架(Application Frameworks) 应用模板(Application Templates) 人工智能(Artificial Intelligence) 程序集处理( ...

  8. 转帖:DotNet 资源大全中文版

    (注:下面用 [$] 标注的表示收费工具,但部分收费工具针对开源软件的开发/部署/托管是免费的) API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框 ...

  9. .Net 开源项目资源大全

    伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-dotnet-cn (注:下面用 ...

随机推荐

  1. html5标签兼容低版本浏览器

    随着html5(后面用h5代表)标签越来越广泛的使用,IE不识别h5标签的问题让人很是烦恼. 在火狐和chrome之类的浏览器中,遇到不认识的标签,只要给个display:block属性,就能让这个元 ...

  2. 「BZOJ 3123」「SDOI 2013」森林「启发式合并」

    题意 你有一个森林,你需要支持两个操作 查询两个结点路径上权值第\(k\)小 两个点之间连一条边 强制在线,结点数\(\leq 8\times 10^4\) 题解 如果可以离线,这就是一个主席树板子题 ...

  3. The method identifyUser(Arrays.asList("group001"), String, new HashMap<>()) is undefined for the type AipFace

    在使用百度云的人脸识别sdk时遇到了这个错误,网上百度不到解决的方法,当我浏览百度云的时候发现了这个 于是考虑到版本可能更新,出现了新的函数代替旧的函数,于是去查文档,文档链接如下 https://c ...

  4. JVM之类加载机制

    JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这 ...

  5. winform列标题高度无法改变

    datagridview行为里把ColumnHeadersHeightSizeMode属性设置为EnableResizing 但好像会导致横向滚动条从底部跑到了中间,还不知道这个BUG的原因,将Col ...

  6. Python3之XML模块

    一.简介 xml是实现不同语言或程序之间进行数据交换的协议,可扩展标记语言,标准通用标记语言的子集.是一种用于标记电子文件使其具有结构性的标记语言.xml格式如下,是通过<>节点来区别数据 ...

  7. python pika简单实现RabbitMQ通信

    Windows上安装及启动RabbitMQ https://blog.csdn.net/hzw19920329/article/details/53156015 安装python pika库 pip ...

  8. mysql的主从与读写分离

    首先我们搭建两个MySQL服务器,这一步地球人都知道. 搭建好后,把两个数据库的数据同步.这一步就要用到我们前面说的备份和还原了.注意:我们只要同步MySQL以外的数据,MySQL库中的帐号密码肯定不 ...

  9. Vue 使用 axios post请求后台数据时 404

    今天遇到Vue 使用 axios post请求后台数据时 404 使用postman 就能获取到 网上找了大半天 终于找到了解决方法,传送门:https://www.jianshu.com/p/b10 ...

  10. PHP 生成 MySql 数据库字典

    项目说明 通过配置 MySql 数据库信息,使用 PHP 生成数据表字典可以输出在当前页面,可以生成文件保存在指定位置,也可以下载格式支持网页HTML格式.CSV格式(Excel 读取).ZIP压缩格 ...