首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ASTMatcher分析函数调用链(上)

2、clang分析AST 使用命令:clang -Xclang -ast-dump -fsyntax-only xxx.m。...:允许用户编写一个程序匹配AST节点并能通过访问节点的c++接口获取该AST节点的属性、源位置等任何信息,其主要由宏与模板驱动,用法和函数式编程类似,其可实现简单精准高效的匹配。...在官网AST Matcher Reference中可以查看clang提供的所有不同类型的匹配器以及说明,主要分为三类(取自【clang】ASTMatcher & clang-query的描述): Note...这里创建函数调用的ASTMatcher的策略如下: (1)寻找想匹配的节点最外层的类:函数调用 (2)在 AST Matcher Reference 中查看所需要的Matcher匹配到需要的节点:objcMessageExpr...很重要的一点是多了解AST Matcher Reference里提供的Matchers,配合clang-query快递验证匹配器的正确性,并且要多熟悉每个节点的使用

6.8K81
您找到你想要的搜索结果了吗?
是的
没有找到

教你如何AST语法树对代码“动手脚”

今天就与大家分享——如何通过用AST语法树改写Java代码。 先抛一个问题:如何将图一代码改写为图二?...你可能会想通过万能的“正则表达式”匹配替换,但当代码较为复杂时(如下图所示),使用“正则表达法”则会将问题复杂化,难以确保所有代码的完美覆盖并匹配。若通过AST语法树,可以很好地解决此问题。...对应的代码较为简短, 使用github的 Netflix-Skunkworks/rewrite开源库与kotlin语言,能读懂Java的你也一定能读明白。...= normalPattern.matcher(line)            var newLine: String = line + ""            while (matcher.find...(2)                val appVersion = matcher.group(3).toInt()                val targetVersion = matcher.group

2.6K60

从Rust到远方:C星系

这篇文章会解释什么是C语言(比较简要),理论上怎样编译Rust供C使用,以及如何在实际使用从Rust和C两方面实现我们的Rust解析器。我们还将看到如何测试这样的绑定。 什么是C语言,为什么有C?...稍后会细讲扫描部分,现在我们快速的看看如何控制头文件中的内容。...虽然得到的最终代码看起来比较的简单易读,但是在知道如何做到这个之前却不是那么显然的。 这就是Rust部分所有的内容。下一个部分我们有展示用C代码调用Rust,以及如何把所有的东西编译到一起。...我们用clang编译!假设上面的代码和gutenberg_post_parser.h文件在同一个目录,也就是在dist/目录。...然后有一个匹配验证AST。Rust非常有表达力,这个测试就是一个很好的例子。

1.3K20

微信安全下一代特征计算引擎的探索与实践

在业界,许多选择使用Python引擎、Lua引擎或两者的组合执行用户编辑的Python脚本或Lua脚本。...我们自研DSL引擎,实际上是开发了一种自定义的编程语言,使用这种编程语言编写特征计算逻辑。要实现一种编程语言,当然要实现这种语言的编译器和执行器,下面将介绍DSL引擎的实现和存在的问题。...另外一个是扩展性较差,例如我们想基于DSL的parser 实现一个类似clangd的代码补全和提示工具,提升DSL脚本开发体验,几乎很难实现,因为DSL的编译器实现紧耦合没有模块化,我们只能基于很原始的字符串匹配实现代码补全提示...Sema语义检查 语义检查包括变量或过程未经声明就使用、变量或过程名重复声明、运算分量类型不匹配、操作符与操作数之间的类型不匹配。...AST如何基于Clang AST实现有趣的工具和功能呢,后面介绍基于Clang开始时展开。

19310

C++反射 - 反射信息的自动生成

C++反射 - 反射信息的自动生成 在前一篇 > 中, 我们介绍了如何利用c++反射的基础设施实现一个lua中间层....早期没有llvm库的时候, 我们只能通过正则匹配等字符串模式匹配的方式完成相关工作, 这种方式比较大的弊端一方面是效率, 另外一方面是业务程序对代码的组织方式可能破坏自动工具的工作, 排查和定位相关问题又不是那么直接...前面介绍了libclang和整个基于AST代码生成的工作原理, 但libclang的使用方式有多种, 我们应该如何选择呢?...()这个成员方法完成对相关AST节点的子节点的访问的. 8.3 一个C#版-ast-dump的实现 熟悉clang的同学可能知道clang是可以通过命令行参数来支持AST输出的: clang -...上面我们看到的AST示例, 就是使用我们的AstDumpTool实现的.

5K20

企业微信零耦合集成腾讯会议和腾讯文档插件化架构实践

,前两种方案简单易实现,但是得到的结果精度不够,不能满足企微团队的需求,最终企微团队选择了解析AST方案,使用 Clang LibTooling 编写工具,通过解析 AST 分析依赖关系。...最终方案:解析 AST。LibTooling 是 LLVM 工具链里的接口,它提供了强大的 AST 解析和控制能力,用于编写基于 Clang 能力的独立工具。...clang-query 可以快速验证 matcher 是否符合预期,解析结果如下图所示: clang-query -p /xxx/xxx/compile_commands.json /xxx/xxx/...工具解析流程如下:首先,使用 ASTMatcher 编写 Matchers 从 AST匹配企微团队需要的节点,提取出每个文件的函数定义/调用、变量定义/调用、类定义/引用列表,列表中还包含每个符号的代码文本...业界常用方案是使用 CocoaPods 管理组件化工程,但它是针对 Swift 和 Objective-C 设计的,不支持跨平台,无法满足需求,最终企微团队选择了一条不同的路。

1.3K80

企业微信 iOS 工程演进之路(一)- 组件化

,前两种方案简单易实现,但是得到的结果精度不够,不能满足我们的需求,最终我们选择了解析AST方案,使用 Clang LibTooling 编写工具,通过解析 AST 分析依赖关系。...最终方案、解析 ASTLibTooling 是 LLVM 工具链里的接口,它提供了强大的 AST 解析和控制能力,用于编写基于 Clang 能力的独立工具。...clang-query 可以快速验证 matcher 是否符合预期,解析结果如下图所示:clang-query -p /xxx/xxx/compile_commands.json /xxx/xxx/Demo.mm...,接下来就是编写工具完成解析工作,工具解析流程如下:使用 ASTMatcher 编写 Matchers 从 AST匹配我们需要的节点,提取出每个文件的函数定义/调用、变量定义/调用、类定义/引用列表...插件开发涉及到多团队协作,不同开发团队有各自的代码仓库、开发工程、规范流程等,如何融合多个插件、让开发流程更顺畅、高效的运转是一个不小的挑战。

1.4K30

C++反射:反射信息的自动生成!

早期没有llvm库的时候,我们只能通过正则匹配等字符串模式匹配的方式完成相关工作,这种方式比较大的弊端一方面是效率,另外一方面是业务程序对代码的组织方式可能破坏自动工具的工作,排查和定位相关问题又不是那么直接...四、libclang的使用方式选择 前面介绍了libclang和整个基于AST代码生成的工作原理,但libclang的使用方式有多种,我们应该如何选择呢?...编译的时候需要注意一下llvm版本与libclangsharp的匹配,g6使用的版本对应的应该是llvm9。...libclang中的API,对应的Api是clang_visitChildren,在ClangSharp中,我们最终是直接使用CXCursor.VisitChildren()这个成员方法完成对相关AST...上面我们看到的AST示例,就是使用我们的AstDumpTool实现的。

3.3K30
领券