作為一個2年的iOS開發(fā)也是最近一段時間才了解到 AST 這么一個東西厢绝。。带猴。
AST在iOS中的應(yīng)用
1昔汉、代碼語法的檢查、代碼風(fēng)格的檢查拴清、代碼的格式化靶病、代碼的高亮、代碼錯誤提示口予、代碼自動補(bǔ)全
image
2娄周、語法分析器 會生成一個抽象語法樹(AST)。之后苹威,語義分析器會進(jìn)行工作并生成一個通過類型檢查的 AST昆咽,這一步的實現(xiàn)就是依賴于 SwiftSyntax (基于 libSyntax 庫開發(fā))
如何生成AST?
1、 命令行
編寫一個 swift_func.swift 文件牙甫,代碼如下:
var a = 1
func add(b: Int) -> Int {
return a + b
}
cd 到當(dāng)前目錄執(zhí)行
xcrun swiftc -frontend -emit-syntax swift_func.swif
運(yùn)行的結(jié)果為一串 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結(jié)構(gòu)掷酗,相比JavaScript的AST復(fù)雜多了
image
2、SwiftSyntax
這里利用SwiftSyntax編寫了一個生成AST的:https://github.com/ChengRuipeng/swift-ast-generator
swift build
等待編譯完成窟哺,執(zhí)行
.build/debug/swift-ast-generator swift_func.swift
目錄下面會生成一個 josn 文件泻轰,就是對應(yīng)的AST
我們可以用 AST 做什么?
1且轨、重寫Swift代碼
在 SwiftSyntax 中有一個示例 展示了如何編寫一個程序來遍歷源文件中的整型并把他們的值加 1
2浮声、高亮代碼
AST可以編譯成Swift么?
昂旋奢。泳挥。。研究了2天 暫時還未找到編譯回Swift的方法至朗,還望哪位大神可以告知屉符!