4. 源代码解析 从lang_dependent_init返回,编译器终于差不多准备好了,可以开始对我们的源代码进行解析。这里看到,每次从命令行执行源文件的编译,编译器都要进行上面那些复杂的初始化过程。这样一次编译,...
4. 源代码解析 从lang_dependent_init返回,编译器终于差不多准备好了,可以开始对我们的源代码进行解析。这里看到,每次从命令行执行源文件的编译,编译器都要进行上面那些复杂的初始化过程。这样一次编译,...
<br />5.12.4.2.2.2.2. 解析实参列表 然后调用cp_parser_enclosed_template_argument_list来解析template-id中所包含的模板实参列表。在这个处理之前,parser的greater_than_is_operator_p域将被设置...
<br />5.12.4.2.2.2.3. 完成template-id 如果模板名是一个IDENTIFER_NODE,它可能是一个成员模板;而如果它是应该类模板的TEMPLATE_DECL,template-id 本身是一个类名;而如果是FUNCTION_DECL,...
5.12.4.2.3.2. 为base-clause构建节点 注意参数base在我们的例子中指向的BOUND_TEMPLATE_TEMPLATE_PARM节点,access是access_public_node。 2242 tree 2243 finish_base_...
<br />5.12.3.2.1.2.1.2.2. 完成阶段 函数cp_parser_function_body只是调用cp_parser_compound_statement来解析复合语句。这里我们跳过解析复合语句的细节,不过记住每个语句都会构建节点并链入语句链...
4.1.5. 最后确定参数在调整完用于目标平台的选项参数后,现在可以最后确定其他参数。对于每个-falign-*标识符,都有对应的*_log变量,其值为不小于这个变量值的最小2的指数倍数,用于.align输出。...
5.9.2.访问控制 函数perform_or_defer_access_check的行为取决于deferred_access_stack栈顶成员的延迟类型。如果栈顶成员是类型dk_deferred,那么对该函数的每次调用,实参binfo及decl将被链入deferred_access_...
5.12.3.2.1.1.1.4. 加入类的TYPE_DECL 现在d是被TEMPLATE_DECL的results域所指向的TYPE_DECL,并由push_template_decl_real所返回。而b是在函数开头就找到的名字空间“Loki”的作用域。...
5.6.1.1.2.3. 字符、字符串常量 当预处理器碰到字符或字符串常量时,它忠实地记录其内容,但不去解释它,因为预处理器没有掌握其格式、编码的信息。这是这里的函数的任务。 c_lex_with_flags ...
4.1.3.1.2.1.2. 读入中间形式的PCH内容之前,我们已经看到一些变量在声明中使用了GTY((…)),GC程序(垃圾回收器)将解析指定的文件(在指定列表外的文件中的GTY((…))是不被解析的,它们将导致编译错误——未定义...
<br />下面的DECL_MAIN_P返回非0值来表示遇到“main”函数,对于该函数一些有趣的限制。看到main函数不能被声明为inline,而且永远是公有可访问的。 grokfndecl (continue) 5642 ...
<br />5.12.3.2.1.1.3.6.1. 退出嵌套类 进一步的,当“消化”掉了类末尾的“;”的时候,它表示我们将要退出类的作用域,并重新进入包含它的作用域。这个操作由5257行的popclass执行。...
<br />5.12.3.2.1.2.2. 闭合类定义 自expand_or_defer_fnàcp_parser_late_parsing_for_memberàcp_parser_late_parsing_for_memberàcp_parser_class_specifier...single_declaration,将执行下面的代码
<br />5.12.3.2.1.2.1.2. 解析函数体 对于在14368行所见的,跟在“)”后面的关键字“return”,其解释参见章节为方法构建节点。 14356static tree 14357cp_parser_function_...
5.12.3.2.1.1. class-specifier的情形 Class-specifier具有规则:class-specifier: class-head { member-specification [opt] } 11855static tree 11856cp_parser_class_specifier (cp_...
<br />5.12.3.2.1.1.1. 解析类体– typedef声明 5.12.3.2.1.1.4.1. 找出decl-specifier-spec及declarator 退出结构体“Lock”的定义,现在回到类“SingleThreaded”的定义。...
4.3.1.7.5.6.5. 处理内建函数的属性 4.3.1.7.5.6.5.1. 建立属性处理方法 虽然我们已经为内建函数的属性创建了节点,我们还未将它们加入到内建函数的节点中。而且即使没有属性,我们也需要在函数...
<br />5.12.3.2.1.1.3.5.2. 为参数构建DECL节点 在解析完参数列表后,在cp_parser_direct_declarator的10492行,make_call_declarator创建如下的树节点。 (点此打开) 图76:非默认构造...
4.3.1.7.7. 具有C++链接性的C++语言成分4.3.1.7.7.1. bad_alloc current_lang_name表示程序所用的语言,现在它被更新为表示C++语言的标识符。它确定了标识符的链接性。例如,C++的标识符需要其名字...
<br />5.12.3.2.1.1.3.5.3. 完成 根据返回的arg_types及parms,在grokdeclarator的7601行,build_function_type构建了如下的FUNCTION_TYPE节点。 (点此打开) 图81:构建的FUNCTION_TYPE...
<br />5.12.3.2.1.1.3.4.3. 缓存内联函数体 函数start_method为这个method-declaration的声明符构建了节点,随后如果方法有缺省参数,这些参数将被parser的unparsed_functions_queues域所记录。...
4.2.6.准备循环优化遍4.2.6.1. 概览 回到backend_init,下一个调用init_loop。这个函数准备那些用于循环优化中的变量。这个优化把常量表达式移出循环体,并且可选地执行强度降低(strength-reduction,期间...
5.3.1.3. 内建宏—pragma指示的处理 所谓的内建宏,也即是标准所定义的宏,计有:__TIME__,__DATE__,__FILE__,__BASE_FILE__,__LINE__,__INCLUDE_LEVEL__,_Pragma及__STDC__(参考builtin_array),其...
5.12.3.2.1.1.1.3. 为类创建TEMPLATE_DECL 因为这是个类模板,它必须要有自己的TEMPLATE_DECL节点来描述其模板特性。现在就要创建这个节点。 pushtag (continue) 4656 d = ...
回到cxx_init_decl_processing,接下来GCC将最终确定的内联函数的选项置入flag_inline_trees。2983行的ptrmemfunc_vbit_in_pfn是枚举类型ptrmemfunc_vbit_where_t。 2048 enumptrmemfunc_vbit_...
5.12.3.2.1.1.3. 解析类体 正常的话,跟在class-head后面的符号应该是“{”,不过要是发生了错误,就不能肯定该符号一定会出现。保险起见,“}”之前的符号都将丢弃,并触发错误。否则,就可以继续放心...
1.1.1. tree_code —— 树节点的ID在tree_node的定义中,结构体,象tree_type,tree_decl 等,用于代表相应的语法成分。比如,tree_type用于类的定义,而type_decl用于声明。但如果需要进一步分别,比如tree_decl...
5.12.3.2.1.1.2. 开始类定义 跟在class-head后,应该是符号“{”,那么在下面的11890行的函数cp_parser_check_type_definition检查定义新的类型在当前上下文是否允许(通过检查parser的type_definition_...
4.3.2.构建异常上下文 从cxx_init返回,在下面的lang_dependent_init中,init_asm_output为输出汇编代码准备好了文件。 lang_dependent_init (continue) 4535 init_asm_output ...
5.6.1.1.2.2. 浮点数 解析整数字符串已经相当麻烦,而浮点数字符串的情况更要复杂得多。同样首先为将要创建的REAL_CST节点选定伴随的类型节点。默认的浮点数具有类型double(CPP_N_MEDIUM)。...