预处理
预处理

预处理操作依赖Preprocessor类,
在clang中,预处理操作并未和词法分析彻底分开,在解析开始时,在Lexer::lex中使用的Lexer::LexTokenInternal函数会根据token的种类来进入不同的处理分支。如token是#则会进入预处理分支,该分支对#关键字符的处理是通过方法HandleDirective来完成的,在HandleDirective函数中,如遇到tok::pp_define,会调用HandleDefineDirective进行处理
在Parser结构体中有一系列关于预处理#pragma操作相关的函数HandlePragma*系列函数,如:
C++HandlePragmaUnused
HandlePragmaAttribute
HandlePragmaRedefineExtname
HandlePragmaOpenCLExtension
这些处理函数会分析各种宏定义、#开头的声明语句并进行相应的处理。
下图是处理#define时的预处理函数调用流程。

C++ASTFrontendAction::Execute()-> ParseAST() -> Parser::Initialize() -> Parser::ConsumeToken() -> Preprocessor::Lex() -> Lexer::lex() -> Lexer::LexTokenInternal() 根据token种类进入不同分支 -> HandleDirective() 对#关键字符的处理-> HandleDefineDirective() 处理tok::pp_define