比较运算符(< <= != == >= > )
(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中