小型Basic编译器问题

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

# 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编译器问题,布布扣,bubuko.com

时间: 2024-10-28 20:49:30

小型Basic编译器问题的相关文章

编译原理大作业(用java编写小型GCC 编译器)

以前只用编译器编译程序,现在学完编译原理这门课以后,通过编译大作业,我对编译器的工作原理有了比较清晰的认识 编译器的工作原理 编译器 (Compiler) 是一种将由一种语言编写的程序转换为另一种编程语言的可执行程序. 现代软件对于编译器的需求远甚从前, 究其原因很简单: 作为中间层, 编译器是构建更高层抽象的基础设施. 编译器意欲将人类可阅读的高阶代码, 翻译为机器能运行的低阶代码. 现代编译器的主要工作流程为: 源代码(source code)→ 预处理器(preprocessor)→ 编译

自己动手写编译器、链接器

编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的BILL GATES,SUN的JAVA之父等等,在编译上都有很深的造诣.曾经在世界首富宝座上稳坐多年的比尔.盖茨也就是从给微机编写Basic语言编译器起家的,也正是这个BASIC编译器为比尔·盖茨和保罗·艾伦的微软帝国奠定了基础.正是这个编写Basic语言编译器的经历,开启盖茨的辉煌职业生涯.编译器是一种相当复杂

自己动手写编译器

<自己动手写编译器.链接器> 纸上得来终觉浅,绝知此事要躬行.                                 ——陆游 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的比尔·盖茨,Sun公司的Java之父等,在编译领域都有很深的造诣.曾经在世界首富宝座上稳坐多年的比尔·盖茨也是从给微机编写BASIC语言编译器起家的,也正是这个BASIC编译

自己动手写编译器、链接器作者自序

<自己动手写编译器.链接器> 纸上得来终觉浅,绝知此事要躬行. --陆游 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的比尔·盖茨,Sun公司的Java之父等,在编译领域都有很深的造诣.曾经在世界首富宝座上稳坐多年的比尔·盖茨也是从给微机编写BASIC语言编译器起家的,也正是这个BASIC编译器为比尔·盖茨和保罗·艾伦的微软帝国奠定了基础.这个编写BASI

自己动手写编译器自序

<自己动手写编译器.链接器>  网址 纸上得来终觉浅,绝知此事要躬行.                                 ——陆游 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的比尔·盖茨,Sun公司的Java之父等,在编译领域都有很深的造诣.曾经在世界首富宝座上稳坐多年的比尔·盖茨也是从给微机编写BASIC语言编译器起家的,也正是这个BAS

自己动手写编译器、链接器一书作者自序

<自己动手写编译器.链接器>  购买网址 纸上得来终觉浅,绝知此事要躬行. --陆游 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的比尔·盖茨,Sun公司的Java之父等,在编译领域都有很深的造诣.曾经在世界首富宝座上稳坐多年的比尔·盖茨也是从给微机编写BASIC语言编译器起家的,也正是这个BASIC编译器为比尔·盖茨和保罗·艾伦的微软帝国奠定了基础.这个

为什么要学写编译器

大树告诉我:根有多深,枝有多茂 高楼跟我说:我只所以能建么高,全仗我有深深的基础 盖茨用亲身经历启迪我:编写BASIC编译器的技术积淀对其事业成功很重要,其辉煌的人生履历从此开始. 一位哲人说:决定人生高度的不是浮在表面的一些东西,而是摒弃浮华. 踏踏实实打下的深深基础. 一位游泳教练教导学员:学再多游泳知识,站在岸上不下水的人永远也学不会游泳. 一位武师告诫弟子:练武不练功,到头一场空. 有位读者问作者:学会了写编译器能赚多少钱? 作者回答:编译器编写是练內功,打基础,通过实战完成技术积淀的过

DotNet 资源大全中文版(Awesome最新版)

Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台. 官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备. 官网 ServiceStack:架构缜密.速度飞快

03 操作系统基础

仅为个人学习备忘,方便日后查阅 一.程序的执行过程 计算机本身就是一堆硬件,其中最核心的就是 CPU 和内存.为了实现计算机获得数据,数据的输入输出,需要输入设备和输出设备.在计算机体系内部,一般来讲,输入输出设备是通过南桥接入当前系统的. 对于一个简单的PC机而言,在某一个时刻只能运行一个程序.但是计算机的计算能力很强,一个程序运行程序内容所占用的 CPU 的时间不是特别多.为了能够尽可能地利用计算机的计算能力,需要将计算机同时运行多个程序,因此每个程序运行起来以后需要一个协调器,这个协调程序