计算机系统要素:第十章 编译器:语法分析

通常来讲,做一个完整的编译器是非常浩大的工程,往往需要许多人经年累月的工作才能实现,但所幸,本书的作者将编译器的实现做到了最简化,我们只需要按照书上7、8、10、11章的框架,便可以在最短的时间内完成一个简易的编译器。

 

这一章的内容是对Jack语言进行语法分析,将每一个Jack文件转化为结构化的xml文件。如果说前面几章的难度已经逐渐由菜鸟变为中等级别的话,最后这几章的难度便开始向达人级别靠拢了。无论是逻辑理解层面,还是代码编写层面,这一章的难度都比前几章要高得多。

 

我的建议是无论有没有理解书本内容,尽快上手写代码,因为绝大多数的知识点在写代码的过程中自然就能理解。

 

构建过程大致有如下几步:

1,从文件中逐个读取字元

2,标明字元类型,进行字元转换

3,分析语法,理解每一种语句类型的结构

4,完成整个递归型的语法分析

 

Step 1:

首先要完成的是从文件中逐个读取字元的功能,主要由advance函数实现。这个功能看起来似乎很简单,但操作起来却相当复杂。

 

在这之前,你必须先消除文档中的所有注释,而一边消除注释一边读取字元这种做法并不可取,因此,我的做法是先将消除注释的文档另存于临时文件copyfile中,做字元分析时,从copyfile中读取内容,最后,再将copyfile删除。

 

紧接着便是读取字元,读取字元的关键点在于,每一次读取都必须返回紧接着的、正确的字元,不能是空格、不能是\n、更不能漏掉一个或者两个字节。在实现这个功能的过程中,我的整体逻辑是:

 

//设置返回值token,起始值为None
//读取下一个字节
//跳过开头的所有无意义字节
 
if选择逻辑
//判断是否为结束
//处理普通字符串
//处理单个符号
//处理在 ” 中的字符串


具体实现可以参考代码,其中细节很多,像rfile.seek(-1,1)函数的运用,就是为了防止漏读问题的发生。

 

Step 2:

这一步的实现相对较简单,只需要给所有的字元加上对应的标识就行,大家可以用xxxT.xml进行比较。在这儿有一个建议,就是可以不按照书上的API进行编程,我就创建了给相应字元加上标识的函数writeToken(wfile,token),并将它放在JackTokenizer中,这么操作对于接下去的工作很有帮助。

 

Step 3:

分析语法的关键在于图10.5,这一张图是接下去工作的重中之重,因为它表明了每一种语句可能的语句结构,大家一定要看清楚,每一个语句的开始在哪儿,结束在哪儿。举个例子,(expression) 和 ’(’expression’)’是不同的,后者表示的是,每一个expression前后都会有()符号进行标注,而前者只是写书的时候为了不引起歧义加上去的括号,没有实际意义。所以,在’(’expression’)’中,<symbol> ) </symbol>应该是在</expression>之后的。所以,一定要理解图10.5中每一个语句表示的含义,然后再进行下一

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值