网站大量收购闲置独家精品文档,联系QQ:2885784924

自己动手编Basic解释器..doc

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自己动手编Basic解释器.

那些客套话咱就不扯那么多了,啥写编译器是多少程序员梦想阿,多牛逼阿之类云云这之类的话咱就不聊了,主要是这里是C(不是java),C程序没java那么多套路,直接单刀赴会了。 好了既然我们是写basic解释器,那我们至少先要明白两件事情:第一,什么是解释器;第二,basic语法这个至少要了解大概吧。 第一,什么是解释器? 编译器大家应该都知道,GCC,VC++(当然这个不纯粹是编译器了),简单的说呢,编译器将程序的源代码转化为可执行代码的形式。通常情况下,这种可执行代码由计算机的CPU指令组成,因此可以直接在计算机上执行。而解释器就不同了,它顺序读入程序的源代码,然后依次执行每一条语句。因此,解释器并不真正将源代码转化为目标代码,而是直接执行程序。 第二,basic语法(以及我们为什么选择basic解释器作为编写目标) 先说第一个为什么写basic? 因为basic语法简单,你听名字也大概知道了,比如我不会选择advance作为编写目标,名字就比较吓人。 basic我们不来详细讲了,因为我们做得这个解释器本来就很小,没涉及到多少东东,有需要的可以google一下。这里先贴一小段代码,混个脸熟: PRINT A Simple Small BASIC Program 打印字符串 FOR X = 1 TO 10 for循环 GOSUB 100 跳到标号100 语句执行 注意这里100是标号 NEXT 下一个x 表示x要加一 END ‘程序结束 100 PRINT X 这里相当于C中函数 RETURN 返回 代码一目了然,我们解释器基本上也就处理这几个关键字。现在摆在我们面前的就是如何处理这些关键字,换句话来说,我们如何在程序读取到相应关键字时,做出相应反应了。比如 我们执行print,我们就要用printf把print后面的东东打印出来。这还比较好办,但是如果是一个for循环呢,我们又该如何处理? 关键字处理是个大麻烦,因为我们面对不同关键字,要做出不同反应来。这个还是后话,眼前我们还是把主要框架先看看。 第一步 装载源代码 用过gcc么?郁闷 gcc都没用过!看来在windows下生活滋润惯了,学计算机还是要来open source阵营阿,话扯远了。我们用gcc编译c文件时,都是gcc -o target source 。 所以我们也仿照这格式,直接用命令行 (图形界面我们就不用实现了,再说俺也不懂)。 main (int argc,char *argv[]) { char *p_buf; char *t; if (argc!=2) { printf (usage: %s filename\n,argv[0]); exit (1); } /* allocate memory for the program */ if (!(p_buf=(char *)malloc(PROG_SIZE))) { printf (allocation failure); exit (1); } /* load the program to execute */ if (!load_program(p_buf,argv[1])) exit(1); } 这里我们开辟一个PROG_SIZE大小空间,供装载程序源码用。然后我们把程序代码用load_program函数装入内存。代码如下: /* Load a program */ load_program (char *p,char *fname) { FILE *fp; int i=0; if (!(fp=fopen(fname,rb))) return 0; i=0; do { *p = getc(fp); p++;i++; } while (!feof(fp)iPROG_SIZE); *(p-2) = \0; /* null terminate the program */ fclose (fp); return 1; } 代码很简单。因为我们现在还没有开始处理语法,下面才是正式开始。 上次我们把程序装载入内存,这里我们开始做词法分析了。hoho~ 开始 一开始我们先再来回顾下:当我们的解释器在执

文档评论(0)

wuailuo + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档