AST Matcher语法树实战工具之clang-query

AST Matcher语法树实战工具之clang-query

开发过程中,写完一个matcher如何检验是否合理正确有效?如果每次都是写完之后去工程跑plugin校验,那是相当烦的。有什么快捷的办法吗?clang-query了解一下?

clang-query

  1. 作用:

    • test matchers :交互式检验
    • explore AST:探索AST 结构&关系
  2. 使用:

    • 首先通过make clang-query 编译获取tool(详细步骤看上篇
    • 然后准备好你的Test project & 一份导出的compile_commands.json
    • 然后执行下面命令
      clang-query -p /path/to/compile_commands.json_dir \
      -extra-arg-before "-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.2.sdk" \
      ./*.m --
    

    注:
    -p:compile_commands.json所在目录路径,
    -extra-arg-before:编译指令前拼接的扩展参数
    ./*.m 编译当前目录下所有.m文件
    -编译附加选项,添加的话不会再从database中加载,-目前没任何选择

执行之后进入clang-query 命令行界面:

//let 给匹配表达式设置个别名
clang-query> let main isExpansionInMainFile()
clang-query> match ifStmt(main,hasCondition(unaryOperator(hasOperatorName("~"),hasUnaryOperand(integerLiteral(unless(equals(false))))))).bind("false")

Match #1:

/Users/yaso/Desktop/YJ/T/Testclang/Testclang/ViewController.m:39:3: note: "false" binds here
  if (~1) {
  ^~~~~~~~~
/Users/yaso/Desktop/YJ/T/Testclang/Testclang/ViewController.m:39:3: note: "root" binds here
  if (~1) {
  ^~~~~~~~~
1 match.
clang-query>

如上,直接match matcher,然后执行正确匹配到相应的结果,并且高亮提示我们bind 的字符串,下面的root 是系统自带,可以set bind-root false关闭。且写matcher过程中,支持tab提示补全很方便。

img

提示补全

结语

所以多熟悉熟悉AST Matcher Reference 里提供的matchers,配合clang-query 快速检验正确性,将使我们PaserAST的效率将会成倍提升。

作者:Yaso
链接:https://www.jianshu.com/p/e2453d404b0c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值