上QQ阅读APP看书,第一时间看更新
2.4 GCC实现词法分析的源代码
2.4.1 词法分析源代码总览
状态转换图体现出来的规则最终要落实在GCC源代码中。我们先来总览GCC源代码中词法分析的部分程序调用架构图,如图2-41所示。
图2-41 词法分析函数调用图
状态转换图的指导思想主要体现在架构图中_cpp_lex_direct函数和cpp_classify_number函数部分,其中_cpp_lex_direct函数完成了所有符号的识别,从初始状态到终态都是在这里完成的;数字的识别相对比较复杂,_cpp_lex_direct函数在识别到数字后,先将其存下来,然后在cpp_classify_number函数中详细甄别数字的具体类型和属性。除了这两个函数外,其他的部分,有些用来做预处理(我们会在第8章详细介绍预处理),另外一些则偏重于工程处理,比如符号识别出来后存储在哪里等。下面我们着重看这两个核心函数的处理过程。
_cpp_lex_direct函数对源代码进行遍历分析,我们先来总体了解此函数。
进入起始状态的代码如下所示:
//代码路径:libcpp/lex.c: cpp_token * _cpp_lex_direct (cpp_reader *pfile) { …… fresh_line: // 跳转到下一行继续分析字符串 …… buffer = pfile->buffer; // 字符串都存储在buffer中,这里是准备获取字符 …… skipped_white: // 跳过空白继续分析字符 …… c = *buffer->cur++; // cur指向的是当前正在分析的字符,cur指向下一个字符 …… }
之后开始分析符号。