算术运算符(* / % + -)
(arithmetic operator)
(一)算术运算符
算术运算符总共有5种:* / % + - 。他们之间优先级关系为:
算术运算符
优先级
* / %
高
+ -
低
算术运算符属于二元运算符,二元运算符的操作数有两个。在Redy中,每一个算术运算符在抽象语法树中,都会用一个结点来表示:
- 结点AstNodeMul表示运算符'*'
- 结点AstNodeDiv表示运算符'/'
- 结点AstNodeMod 表示运算符'%'
- 结点AstNodePlus表示运算符'+'
- 结点AstNodeMinus表示运算符'-'
这5个结点都继承AstNodeBinaryExpr,AstNodeBinaryExpr继承AstObject,用uml表示为:
图1
(二)实例
下面来看两个算术表达式相应的语法树
表达式1: 2*(6+5.2)+3.4*4
图2
表达式1: 2-(3/5+7)*1/4
图3
(三)执行方法
AstNodeMul的执行方法为:
代码3.1
- AstNodeMul.execute()
- AstNodeMul.b_left.execute() /*执行左结点*/
- left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
- AstNodeMul.b_right.execute() /*执行右结点*/
- right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
- ret_value=left_value.mul(right_value) /*调用方法mul*/
- reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
- end
AstNodeDiv的执行方法为:
代码3.2
- AstNodeDiv.execute()
- AstNodeDiv.b_left.execute() /*执行左结点*/
- left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
- AstNodeDiv.b_right.execute() /*执行右结点*/
- right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
- ret_value=left_value.div(right_value) /*调用方法div*/
- reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
- end
AstNodeMod的执行方法为:
代码3.2
- AstNodeMod.execute()
- AstNodeMod.b_left.execute() /*执行左结点*/
- left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
- AstNodeMod.b_right.execute() /*执行右结点*/
- right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
- ret_value=left_value.mod(right_value) /*调用方法mod*/
- reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
- end
AstNodePlus的执行方法为:
代码3.2
- AstNodePlus.execute()
- AstNodePlus.b_left.execute() /*执行左结点*/
- left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
- AstNodePlus.b_right.execute() /*执行右结点*/
- right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
- ret_value=left_value.plus(right_value) /*调用方法plus*/
- reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
- end
AstNodeMinus的执行方法为:
代码3.2
- AstNodeMinus.execute()
- AstNodeMinus.b_left.execute() /*执行左结点*/
- left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
- AstNodeMinus.b_right.execute() /*执行右结点*/
- right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
- ret_value=left_value.minus(right_value) /*调用方法minus*/
- reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
- end
附: 代码下载: git clone git://git.code.sf.net/p/redy/code redy-code
AstNodeMul ,AstNodeDiv, AstNodeMod ,AstNodePlus,AstNodeMinus 位于src/syntax/ 文件ast_node_binary_expr中