我在”hiphop原理分析1”中主要引入了编译原理和hiphop的简单的词法和语法的工作原理,这章节中我将具体的来讲hiphop的语法结构、树的生成、作用域和其他语法结构的关系、以及静态分析的流程。
主要内容
1.基本语法结构
2.生成树的结构
3.作用域的结构以及关系
4.analyzeprogram分析
1. 基本语法结构
首先来说一下hiphop的整体语法结构如下:
l Token:是词的概念。
l Expression:表达式,类似短语的概念。
l Statement:语句,可以理解短语和词组成的一句话。
l Scope(classscope,functionscope):域。可以理解为文章中的段落。作用域:是指一个方法或者一个表达式起作用的范围。
l FileScope:文件域。可以理解为书中的章节。
l Ar:AnalysisResult。可以理解为一本书。
上面我由小到大的将hiphop的整体的语法结构进行了一下整体概念的整理,具体的细节结构我将在第三大章节中讲解细节。
Hiphop 的整体编译环节的文件都在Src/complier文件夹下:
Token:在Src/complier/parser/parser.cpp下定义了ScannerToken和Token类;
Expression:在Src/complier/expression目录下hiphop中的所有Expression结构都定义在该目录下;
Statement:在Src/complier/ Statement目录下hiphop中的所有statement结构都定义在该目录下;
Scope:在src/ complier/analysis/下
file_scope.cpp,function_scope.cpp,class_scope.cpp,block_scope.cpp这4个文件定义了hiphop所有的scope结构;
AnalysisResult:在src/ complier/analysis/analysis_result.cpp中,他封装上了所有的结构和对hiphop的静态分析阶段的所有操作接口;
2. 生成树的结构
2.1. 生成树结构
树是在src/compiler/parser/parser.cpp的saveParseTree()中生成。
在词法解析完成后,进入到语法解析,语法主要分为statement和expression,expresion是statement的下级结构,下面的流程图是一个树状的结构,是一个递归的这么一个树状结构:
statementList=>statement=>expressionList=>expression
2.2. 生成树处理流程图:
(1) hiphop通过lex词法解析完毕后
(2) 进入语法分析阶段,首先进入到最小的expression,然后将 expression添加到expressionList或者statement下面,然后再将statement添加到statementList下;
如果该statement是class或者method 设置这些statement的作用域,最终其实语法树就是一个statementList,然后将每个叶子的statement和expression都设置上相应的scope;
(3) 树封装完毕后(语法树最终封装到Parser类的m_tree中,调用saveParseTree函数封装语法树),每个saveParseTree保存一个文件的语法树,然后在ar中保存上所有filescope,在analysisprogram阶段是通过遍历filesope然后再遍历语法树的;
(4) 在saveParseTree函数中,最终会创建一个虚主函数(通过createPseudoMain函数),创建一个functionStatement和functionScope,然后将m_tree封装到该functionStatement的下级statement中,并将树的作用域指向该function的作用域(PseudoMain),然后将这个主函数的作用域设定为该文件作用域;
(5) 完成语法树的生成
最终的封装结构为:
analysisResult=>fileScopes(所有文件)=>filesope=>functionScope=>statementList=>statement=>ExpressionList=>Expression
2.3. 函数例子:
举个例子:
functiontest(param1,param2,……){
$a =1;
$b =param1;
if(b==7){echo “……”}
……
}
语法解析后结构:
Function test():functionStatement
param1,param2,……:M_params(ExpressionLIst)
param1(..n):ParamterExpression
function内的所有语句封装在m_stmts(statementList)中
$a=1是一个Expstatement
$b=param1;是一个Expstatement
if(b==7){echo“……”} 是一个Ifstatement=>ifbrandstatement, ifbrandstatement又包括条件表达式(m_conditions是一个Expression)和块语句(m_stmt是一个blockstatement);
m_conditions是一个二元表达式(BinaryExpression),b是一个SimpleVarbleExpression封装在m_exp中,op是==,7是一个ScalarExpresion;
块语句{echo “……”}:是一个statementList下面封装了所有的语句(根据不同语句在进行语法解析,如:echo “…”,拆成了2个语句EchoStatement 和Expstatement
生成的function的语法树如下图所示:
2.4. 类例子:
举个类的例子
Class test_c{
functiontest(){
inta = 1;
…..
}
intd = 5;
….
}
语法解析后结构:
Class test_c {}解析为一个classstatement;
Test_c{..}块内的内容封装到一个m_stmts(statementList)中,将类块内的内容封装到该语句内;
Function test():类内的所有的函数都会封装成一个methodstatement,methodstatement是functionstatement的父类,如果有多个类成员函数,那么就创建多个methodstatement封装到m_stmts中,methodstatement块内的结构和参数结构可参考函数例子中的语法树;
生成的树形结构图如下所示:
3. 作用域的结构
3.1. 作用域的结构
作用域包括:文件作用域(filescope)、方法作用域(functionscope)、类作用域(classscope)以及块作用域(blockscope)。其中块作用域是其他所有域的基类。
各作用域之间的结构如下图:
3.2. 作用域之间的关系
l 所有文件域的最外层是analyze_result,是一个blockscope块域,每个文件域Filescope的outerscope均指向它。
l 因为在php中不存在main函数,所以在Filescope中会创建一个pseudomain保存file下的所有的语句(statement)、表达式、作用域(class和function)
l 整体作用域关系图如下:
3.3. 作用域和语法树的关系
作用域和语法树在运行过程中是相互依存的,既作用域中包含下级语法树,同时语法树也包含着当前所在的域。
关系图如下:
语句中会封装该语句所在的作用域;
作用域中也会封装上该作用域中的顶级语句列表(statementList)
作用域的内部关系如下图:
4. Analyzeprogram分析
4.1. Analyzeprogram流程
1.初始化系统变量信息,将系统变量存入到symbol中
2.收集作用域内的所有函数、类
3.把变量、常量、类的对象进行排序
4.检查派生类,保存类之间的派生关系
5.执行该文件下的所有analyzeProgram(filescope,statment,expression)
6.收集用户类下的所有函数
7.收集系统类下的所有函数
6、7步骤中收集的信息保存在analyzeResult类的如下变量中:
l m_functionDecs(保存函数信息),m_functionReDecs(保存重复定义的函数信息),m_classDecs(保存类信息)
l m_methodToClassDecs 类方法集合(key:函数名,value:类的集合(如多个类定义同名的函数))
l 系统类如扩展类、系统自带的一些类(m_systemClasses)
l 上面的这些收集信息的成员变量都是用Map存储的
analyzeProgram函数在src/complier/analysis/analysis_result.cpp中实现;
analyzeProgram函数遍历流程图(hiphop静态分析流程):
Hiphop中很好的用了面向对象中的多态,在scope,statement和expression的所有类中都有一个analyzeProgram函数实现,然后通过analysisResult类的analyzeProgram作为接口向下调用,从作用域(ar)=>文件作用域(filescope)=>函数作用域(functionscope)=>语句(statement)=->表达式(Expression),然后剩下的流程就走最开始上面那7个步骤了,遍历流程是这个流程;
4.2. Analyzeprogram作用
Analyzeprogram的主要作用就是收集所有的类、函数的作用域信息,并且对如参数类型等内容进行类型的初始化设置,和对一些变量创建符号对象(symbol),保存到符号表(varibleTable)中
作用域中有作用域的符号表如functionScope,classScope,如变量表,常量表
5. 小结
这章节中主要对语法树的生成,包括语法树结构等进行了初步的认识,然后又分析了作用域,包括作用域和语句之间的关系,最后对静态分析(analyzeProgram)的流程和作用进行介绍;
在下一节中,我将详细的介绍hiphop中的所有statement,expression和对应php的语法关系,包括analyzeProgram的各个环节(statement,expression)的处理细节。
相关推荐
hiphop无穷动
【HipHop-Step的历史与名称由来】 HipHop-Step,作为街舞文化的重要组成部分,起源于20世纪70年代末至80年代初的纽约。它的诞生源自多种舞蹈形式的融合,其中包括非洲舞蹈、Capoeira、B-Boy舞蹈、Jazz舞以及Tap舞...
此扩展程序在每个新选项卡中都包括最佳嘻哈音乐人的高清图像! 说唱歌手包括Eminem Lil Wayne Drake等! 此扩展程序在每个新选项卡中都包括最佳嘻哈音乐人的高清图像! 非常适合音乐迷! 说唱歌手包括Fetty Wap,...
获取NF的高清图像,NF是当今最好的说唱歌手之一 可以立即访问他的官方社交网站。 您好,NF的粉丝们! 每次打开新选项卡时,获取喜欢的说唱歌手的高清壁纸。 我们授予了访问他的官方Twitter帐户的权限。...
查找流行的说唱歌手YG的高清背景 可以立即访问他的官方社交网站。 爱嘻哈吗? 喜欢YG和他的音乐吗? 如果您这样做,那么此扩展程序就是适合您的扩展程序。 每次打开新标签页,您都会获得不同的YG高清壁纸。...
通过下载并分析Hiphop-API-master这个压缩包,我们可以深入研究其内部结构,包括源代码文件、文档、示例和测试等,以全面了解Hiphop API的功能和用法。此外,社区的支持和讨论也是学习和解决问题的重要资源,可以...
Cardi B和嘻哈音乐的每个宣誓粉丝都必须拥有此扩展名。 如果您喜欢Cardi B和她的音乐,则绝对应该拥有此扩展名。 它包括流行的嘻哈艺术家的高清照片。 此外,我们添加了她的官方Twitter帐户。 因此,您将是第一个...
"Raslani Hip Hop"可能是指一种特定的字体风格,它结合了Hip Hop文化的元素,旨在为文本内容增添独特的个性和动态感。这种字体可能广泛应用于音乐制作、广告设计、游戏界面、社交媒体帖子以及各种创意项目中,以吸引...
Sa-HipHop,最新的南非音乐Mp3下载还包括SA Hip Hop,非洲之家,深层之屋,Gqom,科威特,部落,Masandi和Ampiano。 Sa-HipHop:南非的灵魂音乐在Sa-HipHop的此处下载,我们随时为您提供最好,最精彩的Sa Hip Hop和...
"HIP与NOW缺陷"是两个常见的问题,尤其是在半导体制造和集成电路(IC)设计中。本文将深入探讨这两个缺陷的本质、成因以及如何进行预防和解决。 首先,HIP,全称为Heat Induced Pinholing,翻译为热诱导针孔缺陷。...
每个人都喜欢Hip Hop音乐和Hip Hop Beats,现在Trap成为都市音乐界的一种趋势。 这就是为什么如果您是一名艺术家,则必须获得最好的嘻哈节拍和器乐。 不管他们是R&B,Smooth,Trap还是New School ...他们都必须听...
获取Hip Hop音乐最大传奇-Tupac(2pac)的高清图像 享受! 如果您喜欢2pac和他的音乐。 您打开的每个新标签页都会为他提供高清背景。 除此之外,我们还为您提供了他的官方Twitter帐户的快速访问权限。 因此,您将第...
简单hiphop街舞教学视频.doc
您是否在为下一个项目寻找West Coast,Gangsta,G-Funk或Hip Hop Beats和Instrumental? 这是你的地方! 许多人在节拍和器乐中寻找那种高品质的声音,这些声音使人想起了旧学校和西海岸的嘻哈音乐的开端,但是却没有...
其中,广告牌(Billboard)的嘻哈图表(Hip-Hop Chart)更是备受关注,它反映了当下最热门的嘻哈音乐趋势。本篇文章将围绕“广告牌嘻哈图表API”展开,探讨如何利用Python语言与其进行交互,获取并分析实时的嘻哈...
享受您最喜爱的Hip Hop艺术家的高清图像 - Lil Pump。每个新标签都会获得不同的壁纸。 如果您喜欢嘻哈音乐,那么您肯定对Lil Pump有所了解。 我们添加了您最喜欢的艺术家的高清背景。 此外,借助我们的Twitter小部件...