E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
GCC-3.4.6
Studying note of
GCC-3.4.6
source (92)
5.12.1.2. Parsedecl-specifier-seqpartoftemplatedeclarationDuringparsing,wemayencountererrorstatement,tocontinueparsingaspossible,itisprefertoadvancetothenearest“>”(ofcourse,ifthestatementi
wuhui_gdnt
·
2010-08-27 11:00
tree
Class
token
Constructor
attributes
Parsing
GCC-3.4.6
源代码学习笔记(92)
5.12.3.2. 解析模板声明的decl-specifier-seq部分在解析过程中,我们可能会遇到错误的语句,为了尽可能的继续解析,最好前进到最近的“>”(显然,如果语句是正确的,下一个符号应该是“>”)。接下来为了解析如下类模板的成员模板函数: templateclassstring{public:templateintcompare(constT2&);templa
wuhui_gdnt
·
2010-08-27 11:00
Studying note of
GCC-3.4.6
source (91)
5.12.3.1.2. ProcesstemplateparameterNowwereturnfromcp_parser_parameter_declaration,thencp_parser_template_parameterbacktocp_parser_template_parameter_list,inwhich,variableparameterholdsthetreeno
wuhui_gdnt
·
2010-08-26 11:00
GCC-3.4.6
源代码学习笔记(91)
5.12.3.1.2. 处理模板参数现在我们从cp_parser_parameter_declaration返回,然后从cp_parser_template_parameter回到cp_parser_template_parameter_list。在这个函数中,变量parameter保存上图所示的树节点。 2161tree2162process_template_parm(treeli
wuhui_gdnt
·
2010-08-26 11:00
list
struct
tree
Class
processing
binding
GCC-3.4.6
源代码学习笔记(90)
5.12.3.1.1. 解析模板类型参数首先尝试类型参数。 7654statictree7655cp_parser_template_parameter(cp_parser*parser) inparser.c7656{7657 cp_token*token;76587659 /*Peekatthenextto
wuhui_gdnt
·
2010-08-24 12:00
list
tree
Class
Build
Parameters
token
Studying note of
GCC-3.4.6
source (89)
5.12.3. Thesecondstatement–TEMPLATE_DECLThesecondstatementistemplate-declaration,andtheabbreviatesyntaxtreeisshowninbelow.Thefirstsyntaxisthedeclarationofclasstemplate,andthesecondoneisthedeclarat
wuhui_gdnt
·
2010-08-24 11:00
list
tree
Class
processing
token
Instantiation
Studying note of
GCC-3.4.6
source (88)
5.12.ParseTranslation-unit–declarationsequenceIncp_parser_declaration_seq_opt,declarationsarehandledbycp_parser_declaration.Sonormally,tokenitshouldprocessisonly“endoffile”(CPP_EOF).“}”and“;”comefroma
wuhui_gdnt
·
2010-08-24 11:00
header
tree
token
compiler
Semantic
preprocessor
GCC-3.4.6
源代码学习笔记(88)
5.12. 解析编译单元–声明序列在cp_parser_declaration_seq_opt中,声明具体由cp_parser_declaration来处理,因此正常情况下,真正能落到它手上的符号,只有文件结尾符(CPP_EOF)。“}”及“;”都是不正常的情形。在这么高级别的函数中多出“}”,意味着解析无法继续,只能退出,交由上面的cp_parser_translation_unit来产生错误
wuhui_gdnt
·
2010-08-24 11:00
tree
token
extension
编译器
translation
Semantic
Studying note of
GCC-3.4.6
source (87)
5.11.ParseTranslation-unit-entryThegrammarofthelanguagecanbeshownasatree(ofcourseweneedtreattherecursionofparentaschildnode,mostofwhichwehighlightinredinthefigures).Therootandstartingpointofthetreeist
wuhui_gdnt
·
2010-08-20 11:00
GCC-3.4.6
源代码学习笔记(87)
5.11.解析编译单元–入口C++的语法可以以树的形式显示(当然,我们需要把父节点的递归处理为子节点,绝大部分这样的情况,我们在图中标记为红色)。树的根及起点是translation-unit(编译单元)。在下面的图中,可以看到构建C++解析器不是一件容易的工作。更有甚者,标准提供的语法,本质上,是左递归的。为了能够使用解析器构建器(parserbuilder)来构建解析器,需要把它转换为右递归形
wuhui_gdnt
·
2010-08-20 11:00
工作
File
gcc
token
编译器
translation
Studying note of
GCC-3.4.6
source (86)
5.9.3.ErrorrecoveryErrorrecoveringisaseriousandquitediffculttopic.Whenencounteringerror,howtomakeparserresumetheparsinguponvalidtokensaftertheerrorisalwaysnotaneasytask.Inthefront-endofC++,tentativepa
wuhui_gdnt
·
2010-08-19 11:00
GCC-3.4.6
源代码学习笔记(86)
5.9.3.错误恢复错误恢复是一个重要而又相当困难的议题。当遇到错误时,如何使解析器可以在错误点后的有效符号处重新解析,从来都不是一个简单的事。在C++的前端中,尝试性解析器提供了一个优雅的方法,当我们在尝试中发现了错误,则回滚进行下一个尝试。但是当所有的可能都尝试过而不能成功,我们不得不丢弃符号直到解析器可以重新开始。在C++的前端中,有几个函数用于此目的。第一个函数cp_parser_skip
wuhui_gdnt
·
2010-08-19 11:00
Studying note of
GCC-3.4.6
source (85)
5.9.2.2. IfaccessiblefromfriendsIfprotected_accessible_preturnnonzero,thederivedtreeofcurrentclasscontainsdecl,andtypemustbeitsbase(guaranteedbyblockatline837inprotected_accessible_p),thenitcandirec
wuhui_gdnt
·
2010-08-18 12:00
function
tree
Class
processing
Access
Instantiation
Studying note of
GCC-3.4.6
source (84)
5.9.2.1. Ifaccessiblefromcurrentclasscurrent_class_typeifnotNULL,indicatescurrentscopeisaclass,andwearewithinitsdefinition.Sofirstchecksifdecliswithinthederivationtree,andaccessiblebycurrentclass. 7
wuhui_gdnt
·
2010-08-18 12:00
tree
null
Class
Access
inheritance
traversal
Studying note of
GCC-3.4.6
source (83)
5.9.2.AccesscontrolThebehavorofperform_or_defer_access_checkdependsonthekindofdeferringofthetopelementofthedeferred_access_stack.Ifthetopelementisofdk_deferred,theneverytimeinvokingthefunction,argumen
wuhui_gdnt
·
2010-08-18 12:00
tree
Class
processing
Access
hierarchy
reference
GCC-3.4.6
源代码学习笔记(85)
5.9.2.2. 是否从友元访问如果protected_accessible_p返回非0值,当前类的派生树包含了decl,而且type是当前类的一个基类(protected_accessible_p的837行语句块保证),那么可以直接去检查其访问属性,而且protected以上即可。否则,如果当前类的派生树不包含decl,或者type不是当前类的基类,那么需要检查当前作用域是否是可以访问dec
wuhui_gdnt
·
2010-08-18 12:00
function
tree
Class
processing
Access
Instantiation
GCC-3.4.6
源代码学习笔记(84)
5.9.2.1. 是否从当前类访问如果current_class_type不是NULL,表明当前的作用域是一个类,而且我们正在这个类定义中。首先检查decl是否在这棵派生树里,并且为当前类节点可访问。 795 staticint796 protected_accessible_p(treedecl,treederived,treebinfo)
wuhui_gdnt
·
2010-08-18 12:00
tree
null
Class
Access
inheritance
reference
Studying note of
GCC-3.4.6
source (82)
5.9.Tentativeparser5.9.1.OverviewCurrentGCCworksoutatentativeparser,asC++isn’tastrictcontextindependentsyntax,theparsermayneedseveralattemptsforparsingsuccessfully.Thuswhattheparseneedsistheabilitytop
wuhui_gdnt
·
2010-08-17 12:00
GCC-3.4.6
源代码学习笔记(82)
5.9.试探性的解析器5.9.1.概观当前GCC实现的是一个试探性的C++解析器,由于C++并不是严格的上下文无关文法,解析器可能需要多次尝试才能成功解析。因此解析器需要的是窥视功能——看看自己的理解对不对,不对从头重新解读。这个窥视功能可由cp_lexer_peek_token提供。 643 staticcp_token*644 cp_lexer_peek_token(cp_lexer*lexe
wuhui_gdnt
·
2010-08-17 12:00
Stream
tree
Access
token
debugging
Parsing
Studying note of
GCC-3.4.6
source (81)
5.6.2.CreateparsercontextAftercreatingthemainlexer,itistimetocreateparserbody.Firstisitscontext cp_parser_new(continue) 2240 parser=ggc_alloc_cleared(sizeof(cp_parser));2241 parser->lexer=lexer;2242 p
wuhui_gdnt
·
2010-08-17 11:00
Studying note of
GCC-3.4.6
source (80)
5.6.1.1.2.3. Caseofchar/stringconstantPreprocessorwhenmeetingcharacterorstringconstant,recordsthecontentfaithfully,butcan’tinterpretitasithasn’tanyinformationabouttheformatorcoding,itisthedutyoffu
wuhui_gdnt
·
2010-08-10 12:00
String
struct
token
character
structure
preprocessor
GCC-3.4.6
源代码学习笔记(80)
5.6.1.1.2.3. 字符、字符串常量当预处理器碰到字符或字符串常量时,它忠实地记录其内容,但不去解释它,因为预处理器没有掌握其格式、编码的信息。这是这里的函数的任务。 c_lex_with_flags(continue) 357 caseCPP_ATSIGN: …388 caseCPP_OTHER:389 {390 cppchar_tc=tok
wuhui_gdnt
·
2010-08-10 12:00
c
String
struct
Integer
token
character
Studying note of
GCC-3.4.6
source (79)
5.6.1.1.2.2. CaseoffloatingpointnumberAnalysizingintegerliteralstringisquitetrouble,butfloatingpointliteralstringisamuchcomplexercase.First,itneedsselectthetypenodeassociatingwiththebuildingREAL_C
wuhui_gdnt
·
2010-08-10 12:00
GCC-3.4.6
源代码学习笔记(79)
5.6.1.1.2.2. 浮点数解析整数字符串已经相当麻烦,而浮点数字符串的情况更要复杂得多。同样首先为将要创建的REAL_CST节点选定伴随的类型节点。默认的浮点数具有类型double(CPP_N_MEDIUM)。 568 statictree569 interpret_float(constcpp_token*token,unsignedintflags)
wuhui_gdnt
·
2010-08-10 12:00
String
tree
Integer
Class
float
hex
Studying note of
GCC-3.4.6
source (78)
5.6.1.1.2. NumberPreprocessorknowslittleaboutthenumberexceptitknowswhatisdigit.ItisOKforpreprocessordoessoanditmakesthepreprocessormoreflexible.Butwhenreceivingthedigitalsequencereturnedbypr
wuhui_gdnt
·
2010-08-10 12:00
GCC-3.4.6
源代码学习笔记(78)
5.6.1.1.2. 数字预处理器除了知道什么是数字外,并不尝试去解读它。对于预处理器来说,这样并无不可,而且这样可以使得预处理器更灵活。但是当从预处理器处得到数字序列时,词法分析器需要知道如何解读它。函数cpp_classify_number尝试根据数字字符串设置flags。 143 unsignedint144 cpp_classify_number(cpp_reader*
wuhui_gdnt
·
2010-08-10 11:00
tree
Integer
token
float
hex
Constants
Studying note of
GCC-3.4.6
source (77)
5.6.PreparetheparserNowit’sgoingtoparsethesourcefile,andtheinputoftheparsermustbeidentifiersofC++.ThetoolfetchingidentifiersiscalledLexer.Itisworthnotingthat,GCChasn’tso-calledpreprocessingpass,becaus
wuhui_gdnt
·
2010-08-10 11:00
GCC-3.4.6
源代码学习笔记(77)
5.6.准备解析器现在马上就要解析源文件了,而解析器的输入是必须C++的标识符。用于获取标识符的就称为词法分析器(Lexer)。值得注意的是,GCC并没有所谓的预处理遍,因为cpp_get_token这样的函数,直接就可以获取经过预处理的符号。显然,这个函数也是词法分析器的重要部分。作为源文件解析的第一步,首先准备解析器及附属的词法分析器。 15112void15113c_parse_file(v
wuhui_gdnt
·
2010-08-10 11:00
tree
Integer
buffer
token
Parsing
preprocessor
Studying note of
GCC-3.4.6
source (76)
5.4.Headerfileincludedby-includeAccordingto[6],headerfileincludedby–includeoptionisincludedbeforeanyheaderfileincludedinsourcefile,butthisheaderfileshouldbehandledafterfilespecifiedby–macrobeinghandle
wuhui_gdnt
·
2010-08-06 11:00
GCC-3.4.6
源代码学习笔记(76)
5.4.由-include包含的头文件根据【6】,由选项–include包含的头文件应该在源文件中所包含的头文件之前被引入,但要在被–macro指定的文件处理完成后,才能被处理。如果给出了多个-include选项,那么文件要按在命令行出现的顺序被引入。 finish_options(continue) 1466 include_cursor=0;1467 push_command_line_inc
wuhui_gdnt
·
2010-08-06 11:00
struct
String
File
buffer
token
include
Studying note of
GCC-3.4.6
source (75)
5.3.1.3. Builtinmacro-handlepragmadirectiveTheso-calledbuiltinmacro,definedbyISOC++standards,includes:__TIME__,__DATE__,__FILE__,__BASE_FILE__,__LINE__,__INCLUDE_LEVEL__,_Pragma,and__STDC__(seebuilt
wuhui_gdnt
·
2010-08-05 12:00
GCC-3.4.6
源代码学习笔记(75)
5.3.1.3. 内建宏—pragma指示的处理所谓的内建宏,也即是标准所定义的宏,计有:__TIME__,__DATE__,__FILE__,__BASE_FILE__,__LINE__,__INCLUDE_LEVEL__,_Pragma及__STDC__(参考builtin_array),其处理函数为builtin_macro。 249 staticint250 builtin_macro
wuhui_gdnt
·
2010-08-05 12:00
Studying note of
GCC-3.4.6
source (74)
5.3.1.2. MacroinvocationForourcase,thisnexttokenis“FUN”.Forthisnode,itstypeofcourseisNT_MACRO.Aslongasitsnotdisablemacroandnotintheenvironmentthatpreventmacroexpansion(e.g.,inhandlingassertion,pragm
wuhui_gdnt
·
2010-08-05 12:00
null
token
nested
macros
Standards
Parsing
GCC-3.4.6
源代码学习笔记(74)
5.3.1.2. 宏调用对于我们的案例,这下一个符号是“FUN”。对于这个节点,它的类型无疑是NT_MACRO。只要它不是失能的宏,并且不是在禁止宏展开的环境下(即,在处理断言、pragma、#if系列指示,解析宏参数、函数式的宏调用),enter_macro_context将被调用。 709 staticint710 enter_macro_context(cpp_reader*pfile,
wuhui_gdnt
·
2010-08-05 11:00
null
token
constraints
macros
Standards
Parsing
Studying note of
GCC-3.4.6
source (73)
5.2.Macro,assertionincommandlineMacrosdefinedincommandlinearehavedefinitiongeneratedbeforethosedefinedinsourcefile.Ifmacrosofthesamenamebothappearincommandlineandsourcefile,compilerwillgiveoutwarninga
wuhui_gdnt
·
2010-08-05 11:00
File
search
token
include
Parsing
preprocessor
GCC-3.4.6
源代码学习笔记(73)
5.2.命令行上的宏及断言命令行上定义的宏定义的构建先于源代码中的宏定义。如果命令行及源代码给出同名的宏定义,编译器将给出警告,并且源文件的定义将覆盖命令行上的定义。 finish_options(continue) 1422 /*We'reabouttosenduserinputtocpplib,somakeitwarnfor1423 thingsthatwepreviously(w
wuhui_gdnt
·
2010-08-05 11:00
File
token
include
extension
Diagnostics
Parsing
GCC-3.4.6
源代码学习笔记(72)
5.1.2.C内建宏下面的flag_undef默认是0,但可由选项-undef改写。如果是非0值,则表示不要预定义任何系统特定或GCC特定的宏。但标准预定义的宏仍旧定义(即builtin_array所定义的宏)。 295 void296 c_cpp_builtins(cpp_reader*pfile)
wuhui_gdnt
·
2010-08-03 12:00
Studying note of
GCC-3.4.6
source (71)
4. SourcecodeparsingReturnfromlang_dependent_init,thecompilerisalmostready,andenabletoparseoursourceprogram.Atherewecanseethat,everytimetocompilesourcefile(s)bycommandline,thecompilerwouldtakeab
wuhui_gdnt
·
2010-08-03 12:00
GCC-3.4.6
源代码学习笔记(71)
4. 源代码解析从lang_dependent_init返回,编译器终于差不多准备好了,可以开始对我们的源代码进行解析。这里看到,每次从命令行执行源文件的编译,编译器都要进行上面那些复杂的初始化过程。这样一次编译,被称为一个编译单元。从代码中可以看到,C++编译器的初始化要远远复杂于C编译器的初始化;而且在后面,亦可看到,对C++语言的处理也要远比C语言的处理要复杂。对于简单的源程序,
wuhui_gdnt
·
2010-08-03 12:00
汇编
File
buffer
token
编译器
Comments
Studying note of
GCC-3.4.6
source (70)
4.3.4.Finishcompiler’sinitializationBacklang_dependent_init,itishappytoseetheendofthefunction.Theinitializationofthecompilerwillbefinishedsoon. lang_dependent_init(continue) 4542 /*Thefollowinginitial
wuhui_gdnt
·
2010-07-30 10:00
function
null
Class
float
compiler
initialization
GCC-3.4.6
源代码学习笔记(70)
4.3.4.完成编译器初始化回到lang_dependent_init,终于看到函数的结尾了,编译器的初始化马上就要完成了。 lang_dependent_init(continue) 4542 /*Thefollowinginitializationfunctionsneedtogeneratertl,so4543 provideadummyfunctioncontextforthem. *
wuhui_gdnt
·
2010-07-30 10:00
Studying note of
GCC-3.4.6
source (69)
4.3.3.InitializelibraycallstableMachinedescriptionfilegivesoutthewaytoconstructinstructionsofRTLformforcertainoperation.Forinstructionemition,compilertriestoopencodedRTLcode(ifsomethingisopen-coded,th
wuhui_gdnt
·
2010-07-30 09:00
Studying note of
GCC-3.4.6
source (68)
4.3.2.ConstructexceptioncontextComesbackfromcxx_init,belowinit_asm_outputpreparesthefileforoutputtingassemblecode. lang_dependent_init(continue) 4535 init_asm_output(name);45364537 /*Thesecreatevariou
wuhui_gdnt
·
2010-07-30 09:00
GCC-3.4.6
源代码学习笔记(68)
4.3.2.构建异常上下文从cxx_init返回,在下面的lang_dependent_init中,init_asm_output为输出汇编代码准备好了文件。 lang_dependent_init(continue) 4535 init_asm_output(name);45364537 /*Thesecreatevarious_DECLnodes,soneedtobecalledafterth
wuhui_gdnt
·
2010-07-30 09:00
function
struct
System
编译器
alignment
output
Studying note of
GCC-3.4.6
source (67)
4.3.1.7.8.3. ExceptionhandlerNext,ifwedon’tprohibitexceptionviaswitch-fno-exception,C++runtimewillsetupthefunctions’declarationexceptedbyexceptionhandling.InC++,ifthrowanexceptionbutnotcatchit,the
wuhui_gdnt
·
2010-07-28 11:00
Studying note of
GCC-3.4.6
source (66)
4.3.1.7.8.2.3.2. Post-processingoftype_info4.3.1.7.8.2.3.2.1. Installtype_infoforfundamentaltypesThefront-endinvokesfunctionfinish_filetocloseitwork,andgenerateRTLcodetreefortheback-end.Thefunct
wuhui_gdnt
·
2010-07-28 11:00
GCC-3.4.6
源代码学习笔记(67)
这整个功能由定义在文件
gcc-3.4.6
/libstdc++-v3/libstdsupc++/eh_persona
wuhui_gdnt
·
2010-07-28 10:00
function
tree
Build
library
interface
binding
GCC-3.4.6
源代码学习笔记(66)
4.3.1.7.8.2.3.2. type_info的后处理4.3.1.7.8.2.3.2.1. 安装基本类型type_info对象前端调用函数finish_file最后完成其工作,并为后端产生RTL形式的代码树。也在这个函数中,逐个为unemitted_tinfo_decls中保存的待后处理的伪type_info,构建真正的对象。不过在创建工作之前,首先要安装基本类型的typ
wuhui_gdnt
·
2010-07-28 10:00
tree
null
Class
import
interface
Constructor
GCC-3.4.6
源代码学习笔记(65)
4.3.1.7.8.2.2. 构建type_info的定义下面就是构建这个type_info类型系列。首先是基类。 1251 staticvoid1252 create_tinfo_types(void) inrt
wuhui_gdnt
·
2010-07-28 10:00
GCC-3.4.6
源代码学习笔记(64)
4.3.1.7.8. 完成初始化下面的abort_fndecl代表函数abort,而函数build_library_fn_ptr与build_library_fn相仿,不过它接受字符串作为名字,而不是标识符节点。 cxx_init_decl_processing(continue) 3115 abort_fndecl3116 =build_library_fn_pt
wuhui_gdnt
·
2010-07-28 09:00
function
tree
null
Class
processing
binding
上一页
1
2
3
4
5
6
7
8
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他