编译系统透视:图解编译原理
上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指向下一个字符
  ……
}

之后开始分析符号。