Redy语法分析--位运算符(<< >> & ^ | )
来源:互联网 发布:数据可视化 目标 编辑:程序博客网 时间:2024/05/18 00:48
原文地址: 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中
0 0
- Redy语法分析--位运算符(<< >> & ^ | )
- Redy语法分析--一元运算符(+ - ~)
- Redy语法分析--算术运算符(* /. % + - )
- Redy语法分析--简介
- Redy语法分析--语法分析工具yacc
- Redy语法分析--比较运算符(> >= < <= != == )
- Redy语法分析--文字常量结点
- Redy语法分析--一个简单的四则运算计算器
- Redy语法分析--抽象语法树简介
- Redy语法分析--抽象语法树简介
- Redy语法分析--抽象语法树的数据结构
- Redy语法分析--语句与复合语句结点
- Redy词法识别--运算符的识别
- Redy词法识别--综合识别
- Redy词法识别--简介
- Redy基本数据类型--整数
- java - 位运算
- Redy词法识别--变量,字符串,注释的识别
- 手机号码检测开通微信软件的使用案例(二)
- 在Ubuntu上搭建lnmp / lemp
- String 的常用方法
- 实现ListView 三种不同布局的加载的方式
- 如何使用Photoshop在PSD文件上切图
- Redy语法分析--位运算符(<< >> & ^ | )
- Redis的安装和部署
- 《代码整洁之道》(《Clean Code》)读书笔记
- 圆圈中最后剩下的数字
- Glide--Target
- c语言高级---内存对齐
- 二维码图片下载,补充前面的文章
- 自定义浏览器滚动条的样式
- 百度地图:加强篇(定位)