看完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文件结构里还是很少发生的这种情况的,我只发现这一个。