关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1.问题
如题,如何给指定的表达式添加小括号避免优先级问题? 比如下面的代码:
var a = 1 + 2 ^ 3;
很多人会误以为 "^" 的优先级 大于 "+",其实不然,它应该是这样的:
var a = (1 + 2) ^ 3;
为了避免 自己的认知 与 实际的情况有出入,可以 给 1 + 2 加个小括号。
2.解析
在AST中,有一个 括号表达式,即ParenthesizedExpression,在在线解析网站上 AST explorer,一般看不到,需要如下设置才可以,如下图:
点击上图的 设置 按钮,在弹出的设置窗口点击:
如上图勾选即可。
然后再把代码复制上去:
var a = (1 + 2) ^ 3;
解析后,发现了 括号表达式:
如果没有括号,它是这样的:
唯一的差别就是 ParenthesizedExpression 的 expression 子节点就是 1 + 2.
3.代码
const addParenthesesToNode =
{
BinaryExpression(path)
{
let {left,operator,right} = path.node;
if (types.isBinaryExpression(left,{"operator":"+"}) && operator == "^")
{// "+" 的优先级大于 "^"
path.node.left = types.ParenthesizedExpression(left);
}
}
}
获取 left 子节点,条件过滤后,将其强制转换成 ParenthesizedExpression 节点类型即可。
今天的文章就分享到这里,感谢大家的阅读!
欢迎加入知识星球,学习更多AST和爬虫技巧。