1. 云栖社区>
  2. PHP教程>
  3. 正文

hiphop原理分析2 原创--胡志广

作者:用户 来源:互联网 时间:2017-12-01 18:01:48

原理分析原创志广hiphop

hiphop原理分析2 原创--胡志广 - 摘要: 本文讲的是hiphop原理分析2 原创--胡志广,   我在”hiphop原理分析1”中主要引入了编译原理和hiphop的简单的词法和语法的工作原理,这章节中我将具体的来讲hiphop的语法结构、树的生成、作用域和其他语法结构的关系、以及静态分析的流程。   主要内容1.基本语法结构 2.

 


我在”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


hiphop原理分析2 原创--胡志广


 


2.2.  生成树处理流程图:

hiphop原理分析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的语法树如下图所示:


hiphop原理分析2 原创--胡志广


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块内的结构和参数结构可参考函数例子中的语法树;


 


生成的树形结构图如下所示:


hiphop原理分析2 原创--胡志广


 


3.  作用域的结构
3.1.  作用域的结构

作用域包括:文件作用域(filescope)、方法作用域(functionscope)、类作用域(classscope)以及块作用域(blockscope)。其中块作用域是其他所有域的基类。


 


各作用域之间的结构如下图:


 hiphop原理分析2 原创--胡志广


 


 


3.2.  作用域之间的关系

l  所有文件域的最外层是analyze_result,是一个blockscope块域,每个文件域Filescope的outerscope均指向它。


l  因为在php中不存在main函数,所以在Filescope中会创建一个pseudomain保存file下的所有的语句(statement)、表达式、作用域(class和function)


l  整体作用域关系图如下:


hiphop原理分析2 原创--胡志广


3.3.  作用域和语法树的关系

作用域和语法树在运行过程中是相互依存的,既作用域中包含下级语法树,同时语法树也包含着当前所在的域。


关系图如下:


语句中会封装该语句所在的作用域;


作用域中也会封装上该作用域中的顶级语句列表(statementList)


hiphop原理分析2 原创--胡志广


 


作用域的内部关系如下图:


 


 hiphop原理分析2 原创--胡志广


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原理分析2 原创--胡志广


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原理分析3(1)

hiphop原理分析2 原创--胡志广
大小: 6 KB
hiphop原理分析2 原创--胡志广
大小: 37.4 KB
hiphop原理分析2 原创--胡志广
大小: 19.3 KB
hiphop原理分析2 原创--胡志广
大小: 5.4 KB
hiphop原理分析2 原创--胡志广
大小: 7.1 KB
hiphop原理分析2 原创--胡志广
大小: 9.7 KB
hiphop原理分析2 原创--胡志广
大小: 3.3 KB
hiphop原理分析2 原创--胡志广
大小: 4.6 KB
hiphop原理分析2 原创--胡志广
大小: 9.7 KB
查看图片附件

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索原理 , 分析 , 原创 , 志广 hiphop ,以便于您获取更多的相关知识。

弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率

40+云计算产品,6个月免费体验

现在注册,免费体验40+云产品,及域名优惠!

云服务器9.9元/月,大学必备