Redy语法分析--位运算符(<< >> & ^ | )

    xiaoxiao2021-12-14  21

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

    位运算符( << >> & ^ | )

    (bitwise operator)

    ()位运算符

    位运算符属于二元运算符,有这么5种:<< >> & ^ | 。他们之间的优先级关系为:

    运算符

    优先级

    << >>

    &

    ^

    |

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

    结点AstNodeLShift表示运算符 << 结点AstNodeRShift表示运算符 >> 结点AstNodeBitAnd表示运算符 & 结点AstNodeBitXor表示运算符 ^ 结点AstNodeBitOr表示运算符 |

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

    1

    ()实例

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

    表达式:1>>3|5<<2&1+2^7

    2

    表达式:~8<<4|7*5>>8+2

    3

    ()执行方法:

    AstNodeLShift的执行方法为:

    代码3.1

    AstNodeLShift.execute()     AstNodeLShift.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeLShift.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.lshift(right_value) /*调用方法lshift*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeRShift的执行方法为:

    代码3.2

    AstNodeRShift.execute()     AstNodeRShift.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeRShift.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.rshift(right_value) /*调用方法rshift*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeBitAnd的执行方法为:

    代码3.3

    AstNodeBitAnd.execute()     AstNodeBitAnd.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeBitAnd.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.bit_and(right_value) /*调用方法bit_and*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeBitXor的执行方法为:

    代码3.4

    AstNodeBitXor.execute()     AstNodeBitXor.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeBitXor.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.bit_xor(right_value) /*调用方法bit_xor*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeBitOr的执行方法为:

    代码3.5

    AstNodeBitOr.execute()     AstNodeBitOr.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeBitOr.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.bit_or(right_value) /*调用方法bit_or*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    返回文档首页 

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

    AstNodeLShift  AstNodeRShift  AstNodeBitAnd AstNodeBitXor AstNodeBitOr  位于src/syntax/  文件ast_node_binary_expr中

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

    最新回复(0)