我在“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,Construct是statement和expression的公共基类,也就是说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中,ExpStatement在exp_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_exp(expressionList)中,
=============================================================================
//表达式列表
/*
如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_exp(ExpressionPtr)保存return 后面的表达式;
1.2. 函数语句
1.2.1. MethodStatement:
methodstatement是类的成员函数是封装到该statement中,其实methodstatement是函数的封装主体,外部函数也将数据封装到methodstatement中,因为functionstatement是其子类,methodstatement类在src/complier/statement/method_statement.cpp中;
============================================================================
function和method的属性封装解释
//是否是类函数
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:
functionstatement是methodstatement的子类,封装的语句为非类的成员函数,都是用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:
classStatement是interfaceStatement的子类,classStatement主要封装的是类的信息,而一些基本的信息会封装在interfacestatement中,classstaement在class_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
Loopstatement是hiphop中其他循环语句的基类(do,while,for,foreach)
1.4.2. Dostatement
Php中的do{…}while()语句封装到dostatement中;
Dostatment 下m_stmt(statementList)是保存块内的所有语句的成员;
Dostatement下的m_condition(ExpressionPtr)是保存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{}的块内的所有的statement的List
StatementPtr m_stmt;
1.4.5. Foreachstatement
Php中foreach(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,default的m_condition是空指针
ExpressionPtr m_condition;
//这个是case下的语句,包括break;
StatementPtr m_stmt;
1.5.3. Ifstatement
Php中的if ()整体语句都在ifstatement中封装,有一个statementList的成员保存着多个if:
/*m_stmts 保存的是多个IfBranchStatement如if(){}else if(){}else if(){}
下面无论有多少个子集if,在m_stmts中只保存2个ifBranchStatement,如果是多个
那么在第二个statement下面进行链式存储
*/
StatementListPtr m_stmts;
1.5.4. Ifbranchstatement
Ifbranchstatement是if () elseif()这样的块语句,并且可以多个的话都保存在m_stmt中
Ifbranchstatement有2个属性:
m_condition:保存条件表达式;
m_stmt:保存多层if语句的,详细见下面注释:
//条件
//这 个是if ()括号内的条件,一般为一个BinaryOpExpression
/*
如果是嵌套if块的话if () elseif() else if() else if()...或if() else
在ifstatement中的m_stmts中会保存2个statement ,第一个保存的是正常的,第二个是链式的
如果是链式连接后面的,那么m_condition是0x0空指针
然后在m_stmt下继续是保存2个stmt以此类推,如:
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保存2个ifBranchstatment{
第一个ifBranchstatment 的m_condition是第一个else if 的c2条件m_stmt是第一个else if块内的内容
第二个ifBranchstatment的m_condition是0x0,m_stmt是个ifstatement 保存2个ifBranchstatment;
然后第一个ifBranchstatment保存的是第三个elseif的条件和块语句内容,第二个ifBranchstatment
m_condition是0x0 ,m_stmt保存的是一个ifstatement,m_stmts保存着一个ifBranchstatment 是最后的那个elseif
}
*/
ExpressionPtr m_condition;
//if块内的所有实现的statmentList的内容
StatementPtr m_stmt;
1.6. 中断语句
Breakstatement,continustatement封装break和continue的2个语句类、
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种类型的表达式我未使用过,所以也就没有对其进行分析:
useTraitstaetement,traintAliasstatement,traitPrestatement,gotostatement,
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;
//op的token类型,操作符的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"是里面的一个ArrayPairExpression,ArrayPairExpression成员:
//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
staticClassName是functionCall、classConstantExpression、ConstantExpression、staticMemberExpression的父类;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
保存了2个scalarExpression("aaa")和一个scalarExpression("bbb")
这个不是调用函数的参数,保存的构造函数的参数信息
--------------------------------------------------------------
函数操作中:
如:
functionTest($a,$b){
...
}
Test("a","b");
那么m_name 是test
m_origName保存的是Test
m_params参数信息是保存一个expressionList
保存了2个scalarExpression("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
newObjectExpression是functionCall的子类,用于定义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主要是function和method中的m_params属性中保存着
2.6. 用途较少的表达式
cloureExpression,QopExpression,DymanicFunctionCall,DymanicVarible,EncapsListExpressionList,ListassignmentExpression,这些目前没有进行分析,IncludeExpression没有遇到主要问题也没有进行详细分析;
相关推荐
hiphop无穷动
每个人都喜欢Hip Hop音乐和Hip Hop Beats,现在Trap成为都市音乐界的一种趋势。 这就是为什么如果您是一名艺术家,则必须获得最好的嘻哈节拍和器乐。 不管他们是R&B,Smooth,Trap还是New School ...他们都必须听...
【HipHop-Step的历史与名称由来】 HipHop-Step,作为街舞文化的重要组成部分,起源于20世纪70年代末至80年代初的纽约。它的诞生源自多种舞蹈形式的融合,其中包括非洲舞蹈、Capoeira、B-Boy舞蹈、Jazz舞以及Tap舞...
通过下载并分析Hiphop-API-master这个压缩包,我们可以深入研究其内部结构,包括源代码文件、文档、示例和测试等,以全面了解Hiphop API的功能和用法。此外,社区的支持和讨论也是学习和解决问题的重要资源,可以...
"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,翻译为热诱导针孔缺陷。...
简单hiphop街舞教学视频.doc
享受您最喜爱的Hip Hop艺术家的高清图像 - Lil Pump。每个新标签都会获得不同的壁纸。 如果您喜欢嘻哈音乐,那么您肯定对Lil Pump有所了解。 我们添加了您最喜欢的艺术家的高清背景。 此外,借助我们的Twitter小部件...
安装此扩展程序并享受您最喜爱的RnB和Hip Hop艺术家的高清背景 - The Weeknd。 您喜欢RnB和嘻哈音乐吗? 您喜欢The Weeknd吗? 如果您这样做,那么此扩展名仅适合您。 每个新标签页都会为您显示不同的高清背景或The ...
《HipHop PHP:Facebook的PHP虚拟机与JIT技术解析》 HipHop PHP,是由Facebook在2010年推出的一款高效能的PHP运行时环境,旨在提高PHP代码的执行效率,尤其是对于大规模Web应用来说,它能显著提升性能。这款工具...
嘻哈(Hip Hop)街舞文化起源于20世纪70年代初的美国纽约布朗克斯区,由牙买加移民Kool Herc开创。Kool Herc是最早将大型音响设备带到街头,举办露天派对的人,他的派对因其创新的音乐播放方式——使用唱盘技巧放大...
其中,广告牌(Billboard)的嘻哈图表(Hip-Hop Chart)更是备受关注,它反映了当下最热门的嘻哈音乐趋势。本篇文章将围绕“广告牌嘻哈图表API”展开,探讨如何利用Python语言与其进行交互,获取并分析实时的嘻哈...
1. **hiphop**:hiphop是一种源自美国的街头文化,包含了说唱(Rap)、涂鸦(Graffiti)、街舞(Breakdance)和DJ(Disk Jockey)四大部分。此模板将hiphop元素融入设计,如使用hiphop风格的图形、字体和色彩,以...
HipHop:响应式Web编程 Hiphop.js是用于编排Web应用程序的 DSL。 "use hiphop" "use hopscript" const hh = require ( "hiphop" ) ; hiphop module prg ( in A , in B , in R , out O ) { do { fork { await ...
您是否在为下一个项目寻找West Coast,Gangsta,G-Funk或Hip Hop Beats和Instrumental? 这是你的地方! 许多人在节拍和器乐中寻找那种高品质的声音,这些声音使人想起了旧学校和西海岸的嘻哈音乐的开端,但是却没有...