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

    xiaoxiao2021-12-14  24

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

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

    (arithmetic operator)

    ()算术运算符

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

    算术运算符

    优先级

    * / %

    + -

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

    结点AstNodeMul表示运算符'*' 结点AstNodeDiv表示运算符'/' 结点AstNodeMod 表示运算符'%' 结点AstNodePlus表示运算符'+' 结点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

    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中

    转载请注明原文地址: https://ju.6miu.com/read-969754.html

    最新回复(0)