Swift AST的一点研究

作为一个2年的iOS开发也是最近一段时间才了解到 AST 这么一个东西。。。

AST在iOS中的应用

1、代码语法的检查、代码风格的检查、代码的格式化、代码的高亮、代码错误提示、代码自动补全

2、语法分析器 会生成一个抽象语法树(AST)。之后,语义分析器会进行工作并生成一个通过类型检查的 AST,这一步的实现就是依赖于 SwiftSyntax (基于 libSyntax 库开发)

如何生成AST?

1、 命令行

编写一个 swift_func.swift 文件,代码如下:

var a = 1
func add(b: Int) -> Int {
    return a + b
}
复制代码

cd 到当前目录执行

xcrun swiftc -frontend -emit-syntax swift_func.swif

运行的结果为一串 JSON 格式的 AST

"kind": "CodeBlockItemList",
            "layout": [
                {
                    "kind": "CodeBlockItem",
                    "layout": [
                        {
                            "kind": "VariableDecl",
                            "layout": [
                                null,
                                null,
                                {
                                    "leadingTrivia": [],
                                    "presence": "Present",
                                    "tokenKind": {
                                        "kind": "kw_var"
                                    },
                                    "trailingTrivia": [
                                        {
                                            "kind": "Space",
                                            "value": 1
                                        }
                                    ]
                                },
                                {
                                    "kind": "PatternBindingList",
                                    "layout": [
                                        {
                                            "kind": "PatternBinding",
                                            "layout": [
                                                {
                                                    "kind": "IdentifierPattern",
                                                    "layout": [
                                                        {
                                                            "leadingTrivia": [],
                                                            "presence": "Present",
                                                            "tokenKind": {
                                                                "kind": "identifier",
                                                                "text": "a"
                                                            },
                                                            "trailingTrivia": [
                                                                {
                                                                    "kind": "Space",
                                                                    "value": 1
                                                                }
                                                            ]
                                                        }
                                                    ],
复制代码

稍微整理一下它的AST结构,相比JavaScript的AST复杂多了

2、SwiftSyntax

这里利用SwiftSyntax编写了一个生成AST的:github.com/ChengRuipen…

swift build

等待编译完成,执行

.build/debug/swift-ast-generator swift_func.swift

目录下面会生成一个 josn 文件,就是对应的AST

我们可以用 AST 做什么?

1、重写Swift代码

在 SwiftSyntax 中有一个示例 展示了如何编写一个程序来遍历源文件中的整型并把他们的值加 1

2、高亮代码

AST可以编译成Swift么?

昂。。。研究了2天 暂时还未找到编译回Swift的方法,还望大神可以告知(抱拳)!

猜你喜欢

转载自juejin.im/post/5c920381e51d455c9844f721