- 1、本文档共43页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)