作為一個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的方法,還望大神可以告知(抱拳)!