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

本文详细介绍了Redy语言中的六种比较运算符(&lt;、&lt;=、!=、==、&gt;=、&gt;),包括它们的优先级、在抽象语法树中的表示方式及具体的执行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址: http://blog.chinaunix.net/uid-26750235-id-3147733.html


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

(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中


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值