Redy语法分析--算术运算符(* /. % + - )

本文介绍了算术运算符*/%+–的使用方法及其在Redy抽象语法树中的表示方式,详细展示了不同运算符的执行过程,并通过实例解析了运算符的优先级。

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

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


算术运算符(* / % + -)

(arithmetic operator)

()算术运算符

算术运算符总共有5种:* / % + - 。他们之间优先级关系为:

算术运算符

优先级

* / %

+ -

算术运算符属于二元运算符,二元运算符的操作数有两个。在Redy中,每一个算术运算符在抽象语法树中,都会用一个结点来表示:

    1. 结点AstNodeMul表示运算符'*'
    2. 结点AstNodeDiv表示运算符'/'
    3. 结点AstNodeMod 表示运算符'%'
    4. 结点AstNodePlus表示运算符'+'
    5. 结点AstNodeMinus表示运算符'-'


5个结点都继承AstNodeBinaryExprAstNodeBinaryExpr继承AstObject,用uml表示为:

图1

()实例

下面来看两个算术表达式相应的语法树

表达式1: 2*(6+5.2)+3.4*4

2

    表达式1: 2-(3/5+7)*1/4

3


()执行方法


AstNodeMul的执行方法为:

代码3.1

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

AstNodeDiv的执行方法为:

代码3.2

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

AstNodeMod的执行方法为:

代码3.2

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

AstNodePlus的执行方法为:

代码3.2

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

AstNodeMinus的执行方法为:

代码3.2

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

返回文档首页 

附:  代码下载: git clone git://git.code.sf.net/p/redy/code redy-code

AstNodeMul ,AstNodeDiv, AstNodeMod ,AstNodePlus,AstNodeMinus 位于src/syntax/  文件ast_node_binary_expr中


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值