代码转换工具(as3 - cocos2dx) (四) 表达式分析
2014-11-27 15:18
197 查看
表达式可以说是语法分析的重点,也是我们转换工具的核心。
运算符的详细信息参考运算符优先级(百度百科)
怎样理解运算符的优先级和结合性我们用具体的例子来解释。
例如表达式 a = 1*2 + 3;
这是一个很常见的表达式形式,程序从左往右读
1 读到变量a
2 读到运算符 = ,进入= 号处理
3 = 号左值付为变量a
4 读=号右表达式
5 往右读直到读到比=号优先级更低的符号为止(因为=号右边没有比=号优先级更低的符号了,所以需要读到最后一个+号,然后返回+号的结果给=号右值)
6 读1
7 读*,进入*处理,付左值1,接下来需要读到比*优先级更低或相同的符号为止
8 读2
9 读 + (因为+比*优先级更低),所以这里返回上一步,并返回*
10 *右值付为2,*处理完成
11 读+,付左值*(*的结果为1*2),接下来读到比+优先级更低或相同的符号为止
12 读3
13 遇到表达式结尾,返回 + ,付右值3,+处理完成
14 返回=号,=号右值为+号的值
15 表达式处理完成
从上面的逻辑过程我们可以看到优先级基本是绝对的,如果要读取某一个符号的右值,如果遇到优先级更低的算结束。
例如 !优先级 大于 || , ||优先级 大于 =,其中!属于和=属于右结合, ||属于左结合
左结合的运算符遇到与自己等同的运算符就算结束,但是右结合的运算必须遇到比自己优先级更低的才算结束,例如=
a = b = 1;
第一个=号不能在遇到第2个=号之前结束,因为=属于右结合的,所以第一个=号必须在第二个=号结束后才能返回,并付右值为第2个=号,处理结果相当于
a = (b = 1)
再例如 a = 1 + 2 + 3
第一个+号在1+2就算结束了,第二个+号等于(1+2) + 3,第二个+号的左值等于第一个+号。
以上就是运算符的处理过程,注意理解红色部分的意思,理解了这个就能写出表达式的完整分析了。
下面贴几个运算符的处理代码给大家参考。
运算符的详细信息参考运算符优先级(百度百科)
怎样理解运算符的优先级和结合性我们用具体的例子来解释。
例如表达式 a = 1*2 + 3;
这是一个很常见的表达式形式,程序从左往右读
1 读到变量a
2 读到运算符 = ,进入= 号处理
3 = 号左值付为变量a
4 读=号右表达式
5 往右读直到读到比=号优先级更低的符号为止(因为=号右边没有比=号优先级更低的符号了,所以需要读到最后一个+号,然后返回+号的结果给=号右值)
6 读1
7 读*,进入*处理,付左值1,接下来需要读到比*优先级更低或相同的符号为止
8 读2
9 读 + (因为+比*优先级更低),所以这里返回上一步,并返回*
10 *右值付为2,*处理完成
11 读+,付左值*(*的结果为1*2),接下来读到比+优先级更低或相同的符号为止
12 读3
13 遇到表达式结尾,返回 + ,付右值3,+处理完成
14 返回=号,=号右值为+号的值
15 表达式处理完成
从上面的逻辑过程我们可以看到优先级基本是绝对的,如果要读取某一个符号的右值,如果遇到优先级更低的算结束。
例如 !优先级 大于 || , ||优先级 大于 =,其中!属于和=属于右结合, ||属于左结合
左结合的运算符遇到与自己等同的运算符就算结束,但是右结合的运算必须遇到比自己优先级更低的才算结束,例如=
a = b = 1;
第一个=号不能在遇到第2个=号之前结束,因为=属于右结合的,所以第一个=号必须在第二个=号结束后才能返回,并付右值为第2个=号,处理结果相当于
a = (b = 1)
再例如 a = 1 + 2 + 3
第一个+号在1+2就算结束了,第二个+号等于(1+2) + 3,第二个+号的左值等于第一个+号。
以上就是运算符的处理过程,注意理解红色部分的意思,理解了这个就能写出表达式的完整分析了。
下面贴几个运算符的处理代码给大家参考。
<span style="white-space:pre"> </span>public function AddOperate(file:FileData) { opType = OperateType.OPERATE_ADD; //把当前运算符压入堆栈 file.pushOperate(opType); //赋值左值 left = file.lastValue; file.lastValue = null; //找到下一个 + - 或则比这个优先级更低的符号的前面的value那里 OperateDo.getValueUntillOperateEnd(file); //赋值右值 right = file.lastValue; //当前操作值付给file最后的值 file.lastValue = this; //弹出操作符 file.popOperate(); }
<span style="white-space:pre"> </span>public function EvaluateOperate(file:FileData) { opType = OperateType.EVALUATE; //=号 //获取=号左边的值 left = file.lastValue; file.lastValue = null; //把当前运算符压入堆栈 file.pushOperate(opType); //找到下一个 比这个优先级更低的符号的前面的value那里 OperateDo.getValueUntillOperateEnd(file); //赋值右值 right = file.lastValue; //当前操作值付给file最后的值 file.lastValue = this; //弹出操作符 file.popOperate(); //弹出操作符 file.popOperate(); } }
相关文章推荐
- 代码转换工具(as3 - cocos2dx) (三) 语句分析
- 代码转换工具(as3 - cocos2dx) (一) 由来
- C++正则表达式使用实例--实现一个markdown代码标记转换工具
- 分析工具代码&转换跟踪代码
- 前端H5开发辅助:AS3代码转换成TS语法工具(as2ts)--更新下载
- .NET代码转换工具
- n个VB.Net to C# (C# to VB.net)代码转换(互换互转)工具
- 推荐n个VB.Net to C# (C# to VB.net)代码转换(互换互转)工具
- 一些C#代码 与 VB.net 代码的转换的工具
- 【转】VB.net C# 代码转换工具
- 代码静态分析工具PC-LINT安装配置【转】
- DOS中断跟踪,在纯Dos下使用,分析Dos工作原理的最佳工具,原理详看原代码
- 代码静态分析工具PC-LINT安装配置[转]
- 将html源代码规范化,转换成XSL代码的asp工具
- C++代码静态分析工具-Prefast
- NET2java 一个net代码向java 的代码转换工具
- 推荐n个VB.Net to C# (C# to VB.net)代码转换(互换互转)工具
- 代码覆盖率分析工具--NCover
- C++代码静态分析工具-Prefast