您的位置:首页 > 移动开发 > Cocos引擎

代码转换工具(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,第二个+号的左值等于第一个+号。

       以上就是运算符的处理过程,注意理解红色部分的意思,理解了这个就能写出表达式的完整分析了。

      下面贴几个运算符的处理代码给大家参考。

      

<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();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2dx as js