预编译组件完工的一点归纳总结

原文链接:http://blog.youkuaiyun.com/sonicling/article/details/1435813


刚刚完成了C++编译器预编译组件。只能说大致完成了,有一点还没有达到C++标准所要求的,那就是条件预编译,也即#if directive的comparing expression。根据C++文档,#if 后面应该是一个整型,或者可以看作整型的表达式,我的理解是除了整数外只有bool类型才能看作整型。因此#if后面可以跟数字、比较、defined表达式。但是如果比较两个字符串呢?或者一个是字符串,另外一个是整数?而且根据文档,形如“(0)”的宏定义应该看作“0”,这一点比较麻烦,需要进行深层次的语法分析。然而首先完成的是预编译组件,语法分析还没有开始写。因此等到语法分析组件完工后再回过头来完善。
 
        还有一个问题是效率问题。用一个C文件测试,该文件包含了<algorithm>。预编译比较慢。估计是debug的缘故,大概需要2秒,release一定快一些。但是这仅仅是预处理一个文件。如果有大量的文件就需要更多的时间。效率瓶颈估计出在对token的封装上,也就是词法分析器组件。我将词法分析器用模板封装为了token,在其上重载++操作以完成get_next_token的功能。而token使用的iterator不是char*,而是另外自定义的filebuffer_iterator,原因就是文件在内存中可能是分散的,不连续的,使用char*将不利于对整个文件的遍历。而关键就是filebuffer_iterator的效率。每次token++都会调用iterator++多次,因此iterator的效率有待加强。当然要改为使用char*作为iterator也很容易,因为token和filebuffer_iterator没有依赖关系,直接替换模板参数即可。
 
        接下来就要写语法分析器组件。该组件的目的是将预编译的输出文件转换为语法树,优化则是之后的事情。目前有两条途径可以供我选择:1、使用硬编码,直接在草稿上分析出FIRST-FOLLOW语法,然后将其实现为代码。2、使用某种语法描述语言,分析该语言的模式,并将该模式指导语法分析,即语法制导分析。一个通用的模式分析器在上半年已经完工,可以分析诸如重复、忽略、选择等逻辑,用在语法分析其中已经足够。但是接口尚有待改进。由于当时写模式分析时默认模式串和目标串的iterator相同,然而世纪过程中让调用者提供和目标串iterator类型一样的模式串iterator是困难的,因为所能提供的模式串iterator多半是const char*,即调用时就已知的。因此更改其接口将是一个浩大的工程。而且效率也存在问题:分析一个短句子还可以,若是分析一个长达5000行的c++文件可要耗费很多很多时间了。起码,如果编译效率要达到VC2003的水平,估计一个7000+行的程序应该在不超过2s时间内编译完成,这是一个很高的要求。不过模式串分析只不过是“制导”分析,也就是说如果使用模式分析的话,也不会分析所有的细节,只不过给出一个分析框架或者步骤,具体的分析还是要靠硬编码。至少模式分析很难在分析过程中给出语法错误的诊断信息,因为模式分析的代码是不考虑C++语言具体情况的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值