Swift AST的一點研究

LuckyRoc發表於2019-03-27

作為一個2年的iOS開發也是最近一段時間才瞭解到 AST 這麼一個東西。。。

AST在iOS中的應用

1、程式碼語法的檢查、程式碼風格的檢查、程式碼的格式化、程式碼的高亮、程式碼錯誤提示、程式碼自動補全

Swift AST的一點研究

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複雜多了

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

相關文章