代码转换工具(as3 - cocos2dx) (四) 表达式分析

表达式可以说是语法分析的重点,也是我们转换工具的核心。

运算符的详细信息参考运算符优先级(百度百科)

        怎样理解运算符的优先级和结合性我们用具体的例子来解释。

        例如表达式 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();
			

			}
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值