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

来源:互联网 发布:数据可视化 目标 编辑:程序博客网 时间:2024/05/18 00:48

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


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

(bitwise operator)

()位运算符

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


运算符

优先级

<< >>

&


^


|


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

    1. 结点AstNodeLShift表示运算符 <<
    2. 结点AstNodeRShift表示运算符 >>
    3. 结点AstNodeBitAnd表示运算符 &
    4. 结点AstNodeBitXor表示运算符 ^
    5. 结点AstNodeBitOr表示运算符 |


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

1

()实例

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

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

2

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

3


()执行方法:

AstNodeLShift的执行方法为:

代码3.1

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

AstNodeRShift的执行方法为:

代码3.2

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

AstNodeBitAnd的执行方法为:

代码3.3

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

AstNodeBitXor的执行方法为:

代码3.4

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

AstNodeBitOr的执行方法为:

代码3.5

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


返回文档首页 

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

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


0 0