thrift之compiler源码详解-总结

  看完compiler源码,总的感觉是代码相当清晰,设计结构和命名都很清晰,没什么重复代码,不愧是fackbook那些大牛们写的代码!非常方便学习!

  该compiler跟一般的编译器一样,都是先进行词法分析,然后是语法分析,最后是语议分析,下面将分别对这三个阶段作简单地总结:

(1)词法分析

  该compiler采用flex词法分析生成器来生成词法分析代码。词法分析是指从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。flex通过编译thriftl.ll生成thriftl.cc文件,thriftl.cc即是该compiler的词法分析代码。

(2)语法分析

        该complier采用bison语法分析生成器来生成语法分析代码。语法分析是指在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。语法分析程序判断源程序在结构上是否正确。其中源程序的结构由上下文无关文法描述。bison通过编译thrifty.yy生成thrifty.h和thrifty.cc文件,这两个文件即是该compiler的语法分析代码。

(3)语义分析

        由于该complier可以生成各种语言版本的代码,所以语义分析须针对不同语言采用不用的语义分析,但他们的分析框架是相同的,所以这块代码采用了template设计模式,基类是t_generator,模板函数是t_generator::generate_program();具体语言版本的generator都继承该t_generator,子类只要实现generate_program函数里的虚函数,即可实现某一语言版本的generator(语义分析)。

        这块代码用到了反射机制,每一个generator通过宏THRIFT_REGISTER_GENERATOR(language, long_name, doc)都会自动注册到一个map里,客户只要调用t_generator_registry的static函数get_generator获取到具体语言的generator 。

 

         最后,我觉得代码里有一个不好的地方是.h和.cc文件有时不匹配,如存在t_generator_registry.h而不存在t_generator_registry.cc,t_generator_registry.h声明的函数在t_generator.cc内实现,这对我习惯从头文件查看对应命名的.cc查看实现代码来说,是挺不方便的!但在compiler文件结构里还是很少发生的这种情况的,我只发现这一个。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值