原文地址: http://blog.chinaunix.net/uid-26750235-id-3147733.html
比较运算符(< <= != == >= > )
(compare operator)
(一)比较运算符
比较运算符属于二元运算符,有6种:< <= != == >= >。他们之间的优先级为:
比较运算符
优先级
< <= >= >
高
!= ==
低
在redy中每一个比校运算符在抽象语法树中,都会用一个结点来表示:
其中:
结点AstNodeLt表示运算符 < 结点AstNodeLe表示运算符 <= 结点AstNodeGe表示运算符 >= 结点AstNodeGt 表示运算符 > 结点AstNodeEq表示运算符 == 结点AstNodeNe表示运算符 !=
这6个结点都继承AstNodeBinaryExpr,用uml表示为:
图1
(二)实例
下面来看2个比较表达式相应的语法树
表达式:1<3!=3>=4==2>3
图2
表达式:1<3!=3>=4==2>3
图3
(三)执行方法
AstNodeLt的执行方法:
代码3.1
AstNodeLt.execute() AstNodeLt.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeLt.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.lt(right_value) /*调用方法lt*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeLe的执行方法
代码3.2
AstNodeLe.execute() AstNodeLe.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeLe.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.le(right_value) /*调用方法le*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeGe的执行方法
代码3.3
AstNodeGe.execute() AstNodeGe.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeGe.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.ge(right_value) /*调用方法ge*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeGt的执行方法
代码3.4
AstNodeGt.execute() AstNodeGt.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeGt.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.gt(right_value) /*调用方法gt*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeEq的执行方法
代码3.5
AstNodeEq.execute() AstNodeEq.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeEq.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.eq(right_value) /*调用方法eq*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeNe的执行方法
代码3.6
AstNodeNe.execute() AstNodeNe.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeNe.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.ne(right_value) /*调用方法ne*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
返回文档首页
附: 代码下载: git clone git://git.code.sf.net/p/redy/code redy-code
Ast NodeLe AstNodeLt AstNodeGe AstNodeGt AstNodeEq AstNodeNe 位于src/syntax/ 文件ast_node_binary_expr.h中
