gcc源码分析与应用教程(3)词法分析框架

本章开始讲gcc的词法分析部分,由于gcc中,把所有c系列语言的词法分析都写在了一起,所以词法分析部分也写的相当复杂,下面我们来具体看一下。
我们首先进入到gcc中的libcpp目录下,在这个目录下,便是gcc中,正对c系编程语言的词法分析了,其中有个关键的头文件是cpplib.h,这个头文件便是外部程模块问词法分析模块的接口文件了。
gcc源码分析与应用教程(3)词法分析框架
在介绍这个文件之前,我们首先介绍一些c语言中,有哪些类型的词。
我们记得,在c语言中有,标识符,整数常量,浮点常量,字符常量,字符串常量和运算符这六类。
在cpplib.h中,首先对词语做了一个粗略的划分:
gcc源码分析与应用教程(3)词法分析框架gcc源码分析与应用教程(3)词法分析框架
gcc源码分析与应用教程(3)词法分析框架
从这两张图中,我们可以发现,它仅仅定义了运算符和字符串类型,还有一些宏相关的内容,但是却没有发现任何类似于int,float这样的关键字,那么它定义在哪里呢?
不用着急,首先我在这里说明一下, cpplib.h不是为c语言单独服务的,二十服务于所有类c的编程语言,所以这里的词法分析,只是把所有跟c系列编程语言的公共部分实现了一下,其余细节(类似关键字的定义)在语法模块中单独实现。
我们再接着往下看:
gcc源码分析与应用教程(3)词法分析框架
我们看到有OP和TK的宏定义,人家为啥要再上面定义了这两个宏,然后又在下面取消定义呢?
原来,是为了提高模块的复用性,为了实现TYPE_TABLE这个宏的多态,使这个宏,再不同的地方引用时,能产生不同的性质。
我们再来看另一处的引用例子,再lex.c这个文件内:
gcc源码分析与应用教程(3)词法分析框架
这两个的区别,这里不再重点介绍,大家可以根据宏的展开规则,自行推导一下。
然后我们再去找一找c语言词法分析中的关键字,它定义在c-family/c-common.c文件中:
gcc源码分析与应用教程(3)词法分析框架
gcc源码分析与应用教程(3)词法分析框架
这是一个非常巨大的数组,可以看出gcc它自带的私活非常多,现在我们最关心的两个主题已经找到了,下一步可以开始分析词法分析是怎样进行的。
由于词法分析内容比较多,我们分三部分讲:
1.基础词法分析,按照TYPE_TABLE中的划分讲
2.词法分析中的宏展开
3.高级词法分析,匹配关键字
低级词法分析,主要是从源码文件除,分辨除运算符和标识符,我们重点来看lex.c中的_cpp_lex_direct函数,这个函数比较长,我们来分段说明。
这里面设计到的几个关键的结构体,其中cpp_token在cpplib.h下,cpp_reader和cpp_buffer在internal.h下,其中有个GTY的标识,是一个宏,对代码本身没啥影响,主要是在后期用作垃圾管理机制(先不讲这个)。
gcc源码分析与应用教程(3)词法分析框架
流程如下:
首先从buffer中读取其中的一个字符,根据首个字符的类型,判断词性。
以下是空白格式字符处理:
gcc源码分析与应用教程(3)词法分析框架
数字部分的处理:
gcc源码分析与应用教程(3)词法分析框架
字符串部分处理,其中包含好几种不同字符串:
gcc源码分析与应用教程(3)词法分析框架
标识符部分处理:
gcc源码分析与应用教程(3)词法分析框架
后续是一些很长很长的运算符处理部分,这里不截图了,顺着源码往下看就能看到,还有一些具体的处理细节这里也不具体讲了,大体框架就是这样。
宏相关部分将放到下一章讲,祝大家阅读愉快,谢谢。