免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: TOK_Wang
打印 上一主题 下一主题

Semo Compiler(析码)编译框架 0.2.0 代码,ARM、ELF、SSA等 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-09-03 16:09 |只看该作者
本帖最后由 TOK_Wang 于 2010-09-03 16:13 编辑

回复 20# kallytin
预处理作为一个独立的阶段,把代码处理干净了,再去解析代码,这样可以简化其它模块的复杂度。析码中的做法是预处理后,代码只跟语法有关,所有跟语法无关的信息都会被删除,例如预处理指令,宏,注释等等。

关于宏替换,例如你提到的:

#ifndef DEBUG
   #define A 1
#end

这种代码有控制流,是需要语法分析的,可以这样实现:

遇到#ifndef时,检查其条件是否为真,如果为真便进入其控制域继续解析。如果条件为假,跳至下一个指令或#endif。#ifndef的条件是一个宏。

对于宏的处理,只有两种情况:
(一)宏定义,如"#define A ..." ,遇到这种语句需要将“A”存储起来,可以用一个简单的线性表。
(二)宏引用,如"A",可以这样假设,在预处理阶段所有字符串都是宏引用,就是说每遇到一个字符串就去查找看它是否是一个宏,如果是便进行替换。

论坛徽章:
0
22 [报告]
发表于 2010-09-09 14:28 |只看该作者
本帖最后由 kallytin 于 2010-09-09 15:02 编辑

回复 21# TOK_Wang


TOK_Wang,

另,对于指针和数组,你是怎样处理的?

我的理解:

在C里是没有 指针类型 和 数组类型的,因此如果要构造一个 指针类型(这只是为了检查指针)就会比较麻烦( '*' 是可以不定数量的);且根据C的语法,declaration里是没有指针和数组的,因此作类型检查就会很不便(在C的语法里,pointer是放到 dec->pointer 里的。数组是放到 dec->direct_declarator 中的)。且,在语义分析阶段,除了类型检查之外,还涉及到符号表。如何将指针变量存入符号表( '*' 是不定数量的)? 数组虽然不太一样,但也有类似的问题。

论坛徽章:
0
23 [报告]
发表于 2010-09-10 15:35 |只看该作者
回复 22# kallytin


..........

论坛徽章:
0
24 [报告]
发表于 2010-09-10 15:56 |只看该作者
本帖最后由 TOK_Wang 于 2010-09-10 16:04 编辑

类型检查是跟符号管理机制有关的,这套机制的实现不见得都跟语言有关,这玩意要发挥想象力啊。

typedef struct ANODE {
       
        char* name ;
        int azonaltype ;               
        int datatype ;       
        int belong ;                       
        int scope ;
        //        a handle to LGA
        //        representing  the AZONAL which field is belong to
        int lgabelong ;
        int used ;                               
        int line ;
        int isparam ;                       
        int number ;                       
        int layer ;                       
        int size ;
        int scale ;

        struct {

                int totall ;
               
                struct ANODE* head ;
                struct ANODE* next ;
               
        } tack ;

        //        ANLDRC nodes are saved here
        struct {
               
                int deftimes ;
                SCClList* chain ;

        } DRC ;
       
        struct ANODE* head ;
        struct ANODE* next ;


} AZONAL ;


析码中数组,或者指针会作为一个“AZONAL”节点存到符号表,数组的维度跟指针的“*”数量会保存到“layer”中,类型检查时根据这些信息处理。

论坛徽章:
0
25 [报告]
发表于 2010-09-11 12:39 |只看该作者
回复 24# TOK_Wang


TOK_Wang,

谢谢你之前的回复。另,对于 抽象声明符 ,你会如何处理?


我的理解:

因为在C的语法里面,抽象声明符不包含 id(跟直接声明符不一样),因此抽象声明符不会放入符号表,而只作语义方面的检查。

论坛徽章:
0
26 [报告]
发表于 2010-09-16 18:41 |只看该作者
回复  TOK_Wang


TOK_Wang,

谢谢你之前的回复。另,对于 抽象声明符 ,你会如何处理?


我的理 ...
kallytin 发表于 2010-09-11 12:39


“抽象声明符”什么意思?typedef?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP