`
saiyaren
  • 浏览: 225966 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hiphop 原理分析3(1)原创--胡志广

阅读更多

我在“hiphop原理分析2”中主要分析了语法结构、语法树的生成、作用域内容以及analyzeProgram的功能分析;

本章中,我主要分析hiphop中的所有statement,expressio的对应关系,还有对于所有语句和表达式的analyzeProgram的详细分析。

 

主要内容:

1.语句(statement)结构

2.表达式(Expression)结构

3.analyzeProgram详细分析

4.变量表分析

 

1.  语句(statement)结构

 

1.1.  基本语句

1.1.1.  Statement

statement是所有hiphop的一个基类,statement继承Construct,Constructstatementexpression的公共基类,也就是说hiphop的所有的语法结构都是Construct的子类,statement类在src/complier/statement/statement.cpp下;

1.1.2.  statementList

statementList是一个容器,是封装statement的一个列表容器,m_stmts成员保存statement的内容;

1.1.3.  ExpStatement:

简单表达式语句,如:$a=”aaa”,这样的形式的表达式存放到ExpStatement中,然后下级还会保存其他形式的表达式,封装在m_exp中,ExpStatementexp_statement.cpp中;

=============================================================================

//存放表达式如: $a=1;

  // 这就是一个expstatement

  //然后在m_exp中存入的是一个assignmentExpressionexp1:a op:= scalarExpression:1

  ExpressionPtr m_exp;

=============================================================================

1.1.4.  staticstatement

表达式形式:static$s_1="s_1";static $a,$b;

         Staticstatement中有一个成员m_exp(ExpressionListPtr),在m_exp中保存了所有的static的声明的表达式,一般应该为

         SimpleVarible类型,或者Binary_op_expression(exp1:simpleVarible,exp2:scalarExpression)

1.1.5.  echoStatement

echoStatement保存echo “aaa”形式的语句,然后echo后面的表达式封装在m_expexpressionList)中,

=============================================================================

         //表达式列表

         /*

         echo "aa";

         m_exp保存的就是ScalarExpression

         如果为echo"aa".$b."cc";

         这样的右侧就是BinaryOpExpression嵌套了一个BinaryOpExpression;

         (1)BinaryOpExpression exp1: BinaryOpExpression exp2:scalarExpression (cc)

         (2)BinaryOpExpression:exp1:scalarExpression exp2:scalarExpression

         */

  ExpressionListPtr m_exp;

=============================================================================

1.1.6.  Blockstatement:

块语句{},他里面有一个成员m_stmts保存块内的语句,目前只发现if用了,m_stmts中保存了所有的块下的statement语句

1.1.7.  Globalstatement

global $a,$b;

 m_exp (ExpressionListPtr)保存的是global下的所有的表达式内容:

 simpleVarible 2个对象保存在m_exp下分别是$a,$b

 

1.1.8.  returnstatement

return xxx;形式的语句用returnstatement封装,其中有一个成员m_expExpressionPtr)保存return 后面的表达式;

 

1.2.  函数语句

1.2.1.  MethodStatement:

methodstatement是类的成员函数是封装到该statement中,其实methodstatement是函数的封装主体,外部函数也将数据封装到methodstatement中,因为functionstatement是其子类,methodstatement类在src/complier/statement/method_statement.cpp中;

============================================================================

functionmethod的属性封装解释

//是否是类函数

  bool m_method;

  //是否引用

  bool m_ref;

  int m_attribute;

  int m_cppLength;

  //函数的修饰符如(public,protect,private)

  /*  342, T_PUBLIC

     343, T_PROTECTED

     344, T_PRIVATE*/

  ModifierExpressionPtr m_modifiers;

  //函数名字

  std::string m_name;

  //原始函数名字

  std::string m_originalName;

  //函数的类名称(如果类原始名字为大写,会转为小写)

  std::string m_className;

  //函数类的原始名字(未转换为小写)

  std::string m_originalClassName;

  //参数列表

  ExpressionListPtr m_params;

  //块内语句列表

  StatementListPtr m_stmt;

  //注释

  std::string m_docComment;

============================================================================

1.2.2.  functionStatement:

functionstatementmethodstatement的子类,封装的语句为非类的成员函数,都是用functionstatement保存,function的属性都保存在methodstatement中,functionstatement类在src/complier/statement/function_statement.cpp中;

 

1.3.  类语句

1.3.1.  InterfaceStatement:

接口类型的语句信息是封装到InterfaceStatement中,如interfacetest_i{},该类是在interface_statement.cpp中;

Interfacestatement成员:

//token类型353T_CLASS

  int m_type;

  //类之间派生关系在saveParseTree前就确定了(词法)

  //class A

  //父类的名字,hiphop变名字为小写a

  std::string m_parent;

  //父类的原始名称 原始名称为A

  std::string m_originalParent;

 

1.3.2.  ClassStatement:

classStatementinterfaceStatement的子类,classStatement主要封装的是类的信息,而一些基本的信息会封装在interfacestatement中,classstaementclass_statement.cpp中;

Classstament的成员属性:

//token类型353T_CLASS

  int m_type;

  //类之间派生关系在saveParseTree前就确定了

  //class A

  //父类的名字,hiphop变名字为小写a

  std::string m_parent;

  //父类的原始名称 原始名称为A

  std::string m_originalParent;

1.3.3.  classVarible

classVarible是类变量语句,如public $a,$b;

classVarible的成员变量解释:

=============================================================================

//public $a,$b;

  //修饰符idpublic,protected,private

 ModifierExpressionPtr m_modifiers;

  //声明的表达列表

  /*: public$a,$b;

 m_declaration 就是多个simpleVarible

  */

 ExpressionListPtr m_declaration;

=============================================================================

1.3.4.  classConstant

classConstant是类常量语句,如Const d=2; const d,a;

classConstant语句成员解释:

=============================================================================

 

         //Constd=2; const d,a;

 /*m_exp 中保存的是const的表达式列表,

  d=2 BinaryOpExpression(exp1 :smipleVarible :d ;exp2:scalarExpression :2)

  d,a是多个simpleVarible

  */

 ExpressionListPtr m_exp;

=============================================================================

1.3.5.  unsetstatement

语句形式:unset($a)

Unset是销毁对象的语句,其中m_exp(ExpressionListPtr),保存的是销毁对象的表达式,一般应该是simpleVarible的表达式

 

 

 

 

1.4.  循环语句

1.4.1.  Loopstatement

Loopstatementhiphop中其他循环语句的基类(do,while,for,foreach

1.4.2.  Dostatement

Php中的do{…}while()语句封装到dostatement中;

Dostatment m_stmtstatementList)是保存块内的所有语句的成员;

Dostatement下的m_conditionExpressionPtr)是保存while中的条件的表达式,一般该表达式为BinaryOpExpression类型;

1.4.3.  Whilestatement

Php 中的while(){}语句封装到whilestatement中;

Whilestatement中的2个成员:

  //条件表达式,封装while中的条件

 ExpressionPtr m_condition;

  //块内容,封装的是while块内的所有语句

 StatementPtr m_stmt;

1.4.4.  Forstatemnt

Php中的for(;;){..}语句封装到forstatement中;

Forstatement中有4个重要的成员:(exp1,exp2, exp3, m_stmt)

//for 中第一个表达式BinaryOpExpression(二元表达式)

 ExpressionPtr m_exp1;

  //第二个表达式BinaryOpExpression

 ExpressionPtr m_exp2;

  //第三个表达式UnaryOpExpression(一元表达式)

 ExpressionPtr m_exp3;

 //m_stmt 是存放for{}的块内的所有的statementList

 StatementPtr m_stmt;

1.4.5.  Foreachstatement

Phpforeach(array_expression as $key => $value) {} 的语句封装到foreachstatement中;

Foreachstatement的几个重要的成员:

//foreach($fib as$index => $value)

  //存数类型都是simplevarible

  //第一个参数flib

 ExpressionPtr m_array;

  //第二个参数index

 ExpressionPtr m_name;

  //第三个参数 value

 ExpressionPtr m_value;

 bool m_ref;

 //m_stmt存放的是foreach {}内的所有的statement内容

 StatementPtr m_stmt;

 

1.5.  选择语句

1.5.1.  Switchstatement

Php中的switch语句,switch(){},一般swtichstatement都会和casestatement语句搭配,所以下面看看switchstatement的成员:

//保存的是switch($m_type)括号中的变量的smipleVarible

 ExpressionPtr m_exp;

  //保存的是caseStatment的集合,包括default

 StatementListPtr m_cases;

1.5.2.  Casestatement

一般和switch语句搭配,switch(xxx){case xx:},casestatement下有2个成员:

  //case后的条件表达式,scalarExpression,如case1,defaultm_condition是空指针

 ExpressionPtr m_condition;

  //这个是case下的语句,包括break;

 StatementPtr m_stmt;

1.5.3.  Ifstatement

Php中的if ()整体语句都在ifstatement中封装,有一个statementList的成员保存着多个if

/*m_stmts 保存的是多个IfBranchStatementif(){}else if(){}else if(){}

  下面无论有多少个子集if,在m_stmts中只保存2ifBranchStatement,如果是多个

  那么在第二个statement下面进行链式存储

  */

 StatementListPtr m_stmts;

1.5.4.  Ifbranchstatement

Ifbranchstatementif () elseif()这样的块语句,并且可以多个的话都保存在m_stmt

Ifbranchstatement2个属性:

m_condition:保存条件表达式;

m_stmt:保存多层if语句的,详细见下面注释:

//条件

  // 个是if ()括号内的条件,一般为一个BinaryOpExpression

  /*

         如果是嵌套if块的话if () elseif() else if() else if()...if() else

         ifstatement中的m_stmts中会保存2statement ,第一个保存的是正常的,第二个是链式的

         如果是链式连接后面的,那么m_condition0x0空指针

         然后在m_stmt下继续是保存2stmt以此类推,如:

         if(c1)elseif (c2) if else(c3)if else(c4)那么存储结构如下:

         ifstatment->m_stmt->(1)ifBranchstatment-> m_condition c1,m_stmt是第一个if 下的语句内容

         ifstatment->m_stmt->(2)ifBranchstatment-> m_condition 是个0x0,m_stmt 是个ifstatement保存2ifBranchstatment{

         第一个ifBranchstatment  m_condition是第一个else if c2条件m_stmt是第一个else if块内的内容

         第二个ifBranchstatmentm_condition0x0,m_stmt是个ifstatement 保存2ifBranchstatment;

 

         然后第一个ifBranchstatment保存的是第三个elseif的条件和块语句内容,第二个ifBranchstatment

         m_condition0x0 ,m_stmt保存的是一个ifstatementm_stmts保存着一个ifBranchstatment 是最后的那个elseif

         }

  */

 ExpressionPtr m_condition;

 //if块内的所有实现的statmentList的内容

 StatementPtr m_stmt;

 

1.6.  中断语句

Breakstatement,continustatement封装breakcontinue2个语句类、

 

1.7.  异常语句

Try{..}catch(….){}finally{…}

1.7.1.  Trystatement

Trystatement的成员:

//try的实现体内容

 StatementPtr m_tryStmt;

  //多个catchstatement

 StatementListPtr m_catches;

  // finallyStmt保存finallystatement

 StatementPtr m_finallyStmt;

1.7.2.  Catchstatement

Catch(xxxx){},catchstatement的成员变量:

//catch 括号里的变量

 SimpleVariablePtr m_variable;

 //catch的实现体

 StatementPtr m_stmt;

 StatementPtr m_finallyStmt;

 bool m_valid;

1.7.3.  Finallystatement

Finally{…}

finallystatement中封装finally语句,其中{}块内的语句通过m_stmt(StatementPtr)变量封装。

 

1.7.4.  throwstatement

语句形式:throws Exception

throwstatement中保存Exception的成员是m_exp(ExpressionPtr)

 

1.8.  未使用

如下5种类型的表达式我未使用过,所以也就没有对其进行分析:

useTraitstaetementtraintAliasstatementtraitPrestatementgotostatement

labelstatement

 

2.  表达式(Expression)结构

2.1.  ExpressionList

expressionList主要是保存表达式列表的一个类,其中有3个成员变量组成:

  //表达式集合

 ExpressionPtrVec m_exps;

  intm_outputCount;

  //是否是array的元素

 bool m_arrayElements;

  //链表类型

 ListKind m_kind;

2.2.  基本表达式

2.2.1.  unaryExpression(一元表达式)

一元表达式语句,比如$a++,$a[i]等等,在unaryExpression中有几个重要成员:

  //表达式,保存表达式的类型如变量等

 ExpressionPtr m_exp;

 //默认作用域

 BlockScopeRawPtr m_definedScope;

 /符号token

  intm_op;

2.2.2.  BinaryExpression(二元表达式)

二元表达式如:$a=1,$a>1等,BinaryExpression有如下几个重要成员:

  //表达式1,左表达式

 ExpressionPtr m_exp1;

  //表达式2,右表达式

 ExpressionPtr m_exp2;

 //optoken类型,操作符的token,如 +,-,>等等

  intm_op;

  //是否是赋值表达式

 bool m_assign;

 

2.2.3.  AssiginmentExpression(赋值表达式)

assignmentExpression形式:赋值表达式既是一个赋值表达式,也是一个特殊的二元表达式,该表达式的成员如下:

  //变量

 ExpressionPtr m_variable;

  //变量值

 ExpressionPtr m_value;

2.2.4.  ScalarExpression

一般为值表达式,如$a=1,$b=”aaa”scalarExpression一般封装后面的值如:1”aaa”,该表达式成员为:

  //类型(tokenid)

  intm_type;

  //序列化的值:"i:3;",这就是int类型,值为3

 std::string m_serializedValue;

 double m_dval;

  //当前值,转换后的值

 std::string m_value;

  //原始值,未进行转换的值,如大写转小写

 std::string m_originalValue;

  //转换值(如类转换等),一般为强转类型值

 std::string m_translated;

2.2.5.  SimpleVaribleExpression

简单变量表达式,如:$a=1,$b=”c”,这里的$a$b都是一个simpleVarible,该表达式成员为:

//变量名称

 std::string m_name;

  //注释

 std::string m_docComment;

  //是否是超级类型如_GET等,参见LoadSuperGlobals()函数

 TypePtr m_superGlobalType;

 Symbol *m_sym;

 Symbol *m_originalSym;

  //是否是合法的$this

 unsigned m_this : 1; // whether this is a legitimate $this

  //是否是global

 unsigned m_globals : 1; // whether is is $GLOBAL

2.2.6.  constantExpression

常量表达式,如

define('FOO_BAR','It works!');

主要成员有名称(m_name),注释

 

2.3.  数组表达式

2.3.1.  ArrayPairExpression

arrayPairExpression形式是array("a"=>"Dog","b"=>"Cat","c"=>"Horse");这样声明方式的array调用这个表达式;其中的"a"=>"Dog"是里面的一个ArrayPairExpressionArrayPairExpression成员:

 //m_name保存的是ScalarExpression类型

 ExpressionPtr m_name;

 //m_value 保存的是"Dog" ScalarExpression类型

 ExpressionPtr m_value;

 bool m_ref;

2.3.2.  ArrayElementExpression

arrayElementExpression形式为:array[1]array[“key”],arrayElementExpression的成员如下:

  //存变量内容的(simpleVarible)

 ExpressionPtr m_variable;

  //存下标内容的(scalarExpression)

 ExpressionPtr m_offset;

 

2.4.  类表达式

2.4.1.  ObjectPropertyExpression

ObjectPropertyExpression的表达式形式:$b->b=aaa;

其中ObjectPropertyExpression的成员有:

//存放的是$b 内容simpleVarible

 ExpressionPtr m_object;

  //保存的是->b b的内容scalarExpression

 ExpressionPtr m_property;

2.4.2.  ModiferExpression

修饰符表达式,其中的m_modifiers主要保存着修饰符的token,public ,private,protected

2.4.3.  staticClassName

staticClassNamefunctionCallclassConstantExpressionConstantExpressionstaticMemberExpression的父类;staticClassName表达式有如下成员:

  /*

 $a_c=new A();

 echo $a_c::b

  这种的调用方式中m_class存在,是一个simpleVarible的类型

  */

 ExpressionPtr m_class;

  //类的原始名称

 std::string m_origClassName;

  //类名,如果为self::a则,这里是self ,如静态调用时的类名也保存在这里,如B::c

 std::string m_className;

2.4.4.  classConstantExpression

类常量表达式,形式为:B::c,其中有2个重要的成员,如:

  //常量名称,保存的是c ,B  保存在StaticClassName

 std::string m_varName;

 BlockScope *m_defScope;

2.4.5.  staticMemberExpression

静态成员变量表达式,形式如:B::$c,在该表达式类中有几个重要的成员,如下:

//静态调用B::$c保存的是$c ,B类名保存在StaticClassName,m_exp保存的是$c,scalarExpression

 ExpressionPtr    m_exp;

  //是否有效

 bool             m_valid;

  //当前静态成员解析后隶属的类作用域,B::$c ,那么就是B的作用域

 ClassScopeRawPtr m_resolvedClass;

  //是否是动态的

 bool             m_dynamicClass;

2.5.  函数表达式

2.5.1.  functionCall

函数调用表达式,相关的调用类的表达式都是functionCall的子类,该表达式有如下具体的成员,并进行分析:

  //调用的函数的函数表达式,如:$a->test();scalarExpr(test)

 ExpressionPtr m_nameExp;

  //调用方法的名称

  /*

         类操作中:

         $test=newA();

         $test->aaa();

         m_name保存的是a(这是类的名字)

         然后m_origName保存的会是A这是类的原始名字

         这个参数信息是类的构造函数传入的参数信息如:

                   classA{

                            functionA($a,$b){

        

                            }

                   }

                   $a=newA("aaa","bbb");

                   m_params保存的就是一个expressionList

                   保存了2scalarExpression("aaa")和一个scalarExpression("bbb")

                   这个不是调用函数的参数,保存的构造函数的参数信息

 

         --------------------------------------------------------------

         函数操作中:

         :

         functionTest($a,$b){

                   ...

         }

         Test("a","b");

         那么m_name test

         m_origName保存的是Test

         m_params参数信息是保存一个expressionList

         保存了2scalarExpression("a")和一个scalarExpression("b")

  */

 std::string m_name;

  // 调用方法的原始名称

 std::string m_origName;

  intm_ciTemp;

  intm_clsNameTemp;

  /*参数信息

   */

 ExpressionListPtr m_params;

 

  //Pointers to the corresponding function scope and class scope for this

  //function call, set during the AnalyzeAll phase. These pointers may be

  //null if the function scope or class scope could not be resolved.

  //这个保存的是单独函数的函数作用域,和类的构造函数

 FunctionScopeRawPtr m_funcScope;

  //保存的是类的函数作用域

 ClassScopeRawPtr m_classScope;

 

2.5.2.  SimpleFunctionCallExpression

simpleFunctionCallExpression主要封装的是外部函数的调用,不在类中封装的,如:

a函数中调用了b函数,其实这个表达式也是很复杂的,如在类中调用,外层中调用,函数中调用,在静态分析和优化阶段都需要对其进行很复杂的处理,并且该表达式是functionCall的子类,信息封装在functionCall

 

2.5.3.  NewObjectExpression

newObjectExpressionfunctionCall的子类,用于定义newXXX()这样的表达式类型;

其中的名字(m_name)保存在functionCall中还有构造函数的参数也封装在functioncall中(m_params

2.5.4.  ObjectMethodExpression

ObjectMethodExpression封装的是对象调用函数,如:$a->test(),那么这个test就是ObjectMethodExpression,这个表达式类也是functionCall的子类,在该类中有个成员,m_object保存的是对象信息,如:

$a->test();

m_object $a simpleVaribale对象,test()信息保存在funcationcall

 

 

2.5.5.  ParameterExpression

ParameterExpression主要是functionmethod中的m_params属性中保存着

 

2.6.  用途较少的表达式

cloureExpressionQopExpressionDymanicFunctionCallDymanicVaribleEncapsListExpressionListListassignmentExpression,这些目前没有进行分析,IncludeExpression没有遇到主要问题也没有进行详细分析;

 

下一节:hiphop 原理分析3(2)

 

  • 大小: 40.8 KB
  • 大小: 81.6 KB
1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics