作为一个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的:https://github.com/ChengRuipeng/swift-ast-generator
swift build
等待编译完成,执行
.build/debug/swift-ast-generator swift_func.swift
目录下面会生成一个 josn 文件,就是对应的AST
我们可以用 AST 做什么?
1、重写Swift代码
在 SwiftSyntax 中有一个示例 展示了如何编写一个程序来遍历源文件中的整型并把他们的值加 1
2、高亮代码
AST可以编译成Swift么?
昂。。。研究了2天 暂时还未找到编译回Swift的方法,还望哪位大神可以告知!