AST基础知识|从AST解析看运算符的优先级

关注它,不迷路。       

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

1. 需求分析

如何通过AST解析后的代码观察运算符的优先级?如何确保还原不出错?

2. 实例分析1

将下面的代码拿到在线解析网站上分析:

1 + 2 + 3;

解析后的结果:

44002e307ae80c63bdd75afbbc840dde.png

从上图可以看出,它把 "1 + 2 + 3" 解析成了 BinaryExpression 类型,而其左孩子节点 同样是一个 BinaryExpression 类型(1 + 2),右孩子节点是一个 NumericLiteral 类型(3)。等价于:

(1 + 2) + 3;

将代码变形一下,变成:

1 + 2 * 3;

解析后的结果:

4e2eda093efdc0e59f87f1ca22a89e8a.png

从上图可以看出,它同样把 "1 + 2 * 3" 解析成了 BinaryExpression 类型,不同的是,左孩子节点变成了NumericLiteral 类型(1);而右孩子节点变成了 BinaryExpression 类型(2 * 3);等价于:

1 + (2 * 3);

由此可以推断出运算符 * 比 + 的优先级要高。

3. 实例分析2

再看下面的例子

zc(s === Sc || s === Ac ? 192 : 204);

通过解析后的AST来分析 "||" 与 "?" 的优先级谁的高?下面是解析后的代码:

3362af3a53530496e018bd244babb264.png

从上面的解析可以看出,ConditionalExpression 类型的test子节点是 

LogicalExpression 类型,这就说明了" || "的优先级比" ? "的要高.

即:

zc((s === Sc || s === Ac) ? 192 : 204);

我们可以反推,如果 "||" 比 "?" 的优先级低的话,应该解析成 :

zc(s === Sc || (s === Ac ? 192 : 204));

如下图:

bb06f48159a55daa614363f66686a344.png

这都已经不是 ConditionalExpression 类型了,因此可以判断出," || "的优先级比" ? "的要高。

今天的文章就分享到这里,后续分享更多的技巧,敬请期待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值