hiphop 原理分析3(1)原创--胡志广_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > hiphop 原理分析3(1)原创--胡志广

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

 2013/7/10 2:35:45  saiyaren  程序员俱乐部  我要评论(0)
  • 摘要:我在“hiphop原理分析2”中主要分析了语法结构、语法树的生成、作用域内容以及analyzeProgram的功能分析;本章中,我主要分析hiphop中的所有statement,expressio的对应关系,还有对于所有语句和表达式的analyzeProgram的详细分析。主要内容:1.语句(statement)结构2.表达式(Expression)结构3.analyzeProgram详细分析4.变量表分析1.语句(statement)结构1.1.基本语句1.1.1.Statement
  • 标签:原创 分析

我在“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类型,caozuofu.html" target="_blank">操作符的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保存的是a?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
  • 查看图片附件
发表评论
用户名: 匿名