Redy语法分析--比较运算符(> >= < <= != == )

6329阅读 0评论2012-03-25 NosicLin
分类:Python/Ruby

返回文档首页 

比较运算符(< <= != == >= > )

(compare operator)

()比较运算符

比较运算符属于二元运算符,有6种:< <= != == >= >。他们之间的优先级为:


比较运算符

优先级

< <= >= >

!= ==


redy中每一个比校运算符在抽象语法树中,都会用一个结点来表示:

其中:

    1. 结点AstNodeLt表示运算符 <
    2. 结点AstNodeLe表示运算符 <=
    3. 结点AstNodeGe表示运算符 >=
    4. 结点AstNodeGt 表示运算符 >
    5. 结点AstNodeEq表示运算符 ==
    6. 结点AstNodeNe表示运算符 !=


6个结点都继承AstNodeBinaryExpr,用uml表示为:

1


()实例

下面来看2个比较表达式相应的语法树

表达式:1<3!=3>=4==2>3

2

表达式:1<3!=3>=4==2>3

3


()执行方法

AstNodeLt的执行方法:

代码3.1

  1. AstNodeLt.execute()
  2.     AstNodeLt.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeLt.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.lt(right_value) /*调用方法lt*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeLe的执行方法

代码3.2

  1. AstNodeLe.execute()
  2.     AstNodeLe.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeLe.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.le(right_value) /*调用方法le*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeGe的执行方法

代码3.3

  1. AstNodeGe.execute()
  2.     AstNodeGe.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeGe.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.ge(right_value) /*调用方法ge*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeGt的执行方法

代码3.4

  1. AstNodeGt.execute()
  2.     AstNodeGt.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeGt.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.gt(right_value) /*调用方法gt*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeEq的执行方法

代码3.5

  1. AstNodeEq.execute()
  2.     AstNodeEq.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeEq.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.eq(right_value) /*调用方法eq*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeNe的执行方法

代码3.6

  1. AstNodeNe.execute()
  2.     AstNodeNe.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeNe.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.ne(right_value) /*调用方法ne*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. 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中

上一篇:Redy语法分析--位运算符(<< >> & ^ | )
下一篇:随笔--常见的数据结构与算法