91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python的簡單四則運算語法樹可視化怎么實現

發布時間:2023-05-08 17:22:42 來源:億速云 閱讀:216 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“python的簡單四則運算語法樹可視化怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“python的簡單四則運算語法樹可視化怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

簡單四則運算語法樹可視化

如果想要動手嘗試一下,需要安裝一下這個 python 可視化庫。

python的簡單四則運算語法樹可視化怎么實現

解析 AST

Python 的 ast 庫有一個 parse 方法,可以把傳入的內容,解析成一個 AST。然后我們使用 ast.dump 將其導出并打印。
注意:indent 這個參數是 Python 3.9 以后才有的,如果版本低的話,可以去掉,只會影響最后輸出的格式。

python的簡單四則運算語法樹可視化怎么實現

好了,就是這么簡單。我們已經做到了,因為這個庫的功能很強大,但是這里只是用到一點點而已。其實這里已經可以看出基本的結構了,不過我的目的是生成這棵樹的 JSON 表示。我想要使用上面的 Python 繪圖庫把它繪制出來,它所支持的輸入是 JSON,并且它的格式為:

{
	"name": "A",
	"children": [
		"name": "B",
		"children": []
	]
}

粗糙的遍歷方法

"""
Python's AST
利用 Python 的 ast 模塊來解析表達式(簡單的二元運算),
然后通過遍歷語法樹來生成 JSON 表示,再使用 PYthon 的庫來
將其可視化。這個程序的目的是為了驗證自己寫的簡易解析器是否正確。
"""

import ast
import json


# 操作類型和操作符映射的字典
OPERATORS = {
    ast.Add: "+",
    ast.Sub: "-",
    ast.Mult: "*",
    ast.Div: "/"
}


def generate(tree: ast.Module):
    """
    generate expression AST's representation of JSON
    """
    if not tree:
        raise Exception("Emtpy AST tree!")
    if tree.__class__ == ast.Module:
        print(json.dumps({
            "name": "Expr",
            "children": [DFS(tree.body[0].value)]  # type: ignore
        }, indent=4))


def DFS(node):
    """
    DFS AST
    """
    if not node:
        return {}

    if node.__class__ == ast.BinOp:
        return {
            "name": "BinOp",
            "children": [
                {
                    "name": "left",
                    "children": [
                        DFS(node.left)
                    ]
                },
                DFS(node.op),
                {
                    "name": "left",
                    "children": [
                        DFS(node.right)
                    ]
                }
            ]
        }

    if node.__class__ == ast.Constant:
        return {
            "name": "NUMBER",
            "children": [
                {
                    "name": str(node.value)  # Python 的繪圖庫,必須是字符串才能正常顯示
                }
            ]
        }

    if node.__class__ in [ast.Add, ast.Sub, ast.Mult, ast.Div]:
        return {
            "name": "Op",
            "children": [
                {
                    "name": OPERATORS[node.__class__]
                }
            ]
        }

    # 這里我只處理 加減乘除和數字類型的運行
    raise Exception("There is not support extra type.")


if __name__ == "__main__":
    ast_tree = ast.parse("1+2+3+4+5")
    print(ast.dump(ast_tree, indent=4))
    generate(ast_tree)

運行結果:
我這里會輸出兩個東西,一個是 AST 的 dump;另一個是 AST 的 JSON 表示(邏輯結構的 JSON 表示,不是對象的 JSON 表示)。

python的簡單四則運算語法樹可視化怎么實現

渲染顯示

把打印出來的 JSON 字符串復制進文件,命名為 data.json。我感覺直接輸出到控制臺蠻有意思的,我喜歡直接看到它的結果。
執行如下命令:pytm-cli -d TB -i data.json -o demo.html
在瀏覽器打開 demo.html 即可看到效果了。

python的簡單四則運算語法樹可視化怎么實現

主流的遍歷方法

上面這種遍歷方法雖然便于理解,但是難以擴展。AST 通常是通過 訪問者模式 進行遍歷的,而且 ast 庫也提供了幾種遍歷方法。
因為這里只需要遍歷來生成 JSON,并不需要修改AST本身,所以我們只看下面這兩種即可。顯然第一種是不能用的,原因已經用藍色標記出來了。它自己說了如果你不關心上下文,因為生成 JSON 實際上是需要關注這個的。所以,我選擇下面的 ast.NodeVisitor。使用它也很簡單,繼承這個類,然后對不同的節點寫不同的處理邏輯就行了(這樣把不同節點的邏輯分開了,降低了代碼的耦合性)。

python的簡單四則運算語法樹可視化怎么實現

完整代碼

"""
Python's AST
利用 Python 的 ast 模塊來解析表達式(簡單的二元運算),
然后通過遍歷語法樹來生成 JSON 表示,再使用 PYthon 的庫來
將其可視化。這個程序的目的是為了驗證自己寫的簡易解析器是否正確。
"""

import ast
import json


# 操作類型和操作符映射的字典
OPERATORS = {
    ast.Add: "+",
    ast.Sub: "-",
    ast.Mult: "*",
    ast.Div: "/"
}

class JSONVisitor(ast.NodeVisitor):
    """
    JSON visitor: Traversal AST and generate JSON representation
    """

    def visit_Module(self, node):
        module = {
            "name": "Module",
            "children": []
        }
        for sub_node in node.body:
            module["children"].append(self.visit(sub_node))

        return module

    def visit_Expr(self, node):
        return {
            "name": "Expr",
            "children": [
                self.visit(node.value)
            ]
        }

    def visit_BinOp(self, node):
        return {
            "name": "BinOp",
            "children": [
                {
                    "name": "left",
                    "children": [
                        self.visit(node.left)
                    ]
                },
                self.visit(node.op),
                {
                    "name": "right",
                    "children": [
                        self.visit(node.right)
                    ]
                }
            ]
        }

    def visit_Constant(self, node):
        return {
            "name": "NUMBER",
            "children": [{
                "name": str(node.value)  # # Python 的繪圖庫,必須是字符串才能正常顯示
            }]
        }

    def visit_Add(self, node):
        return self.__visit(node)

    def visit_Sub(self, node):
        return self.__visit(node)

    def visit_Mult(self, node):
        return self.__visit(node)

    def visit_Div(self, node):
        return self.__visit(node)

    def __visit(self, node):
        return {
            "name": "Op",
            "children": [{
                "name": OPERATORS[node.__class__]
            }]
        }


if __name__ == "__main__":
    ast_tree = ast.parse("1+2+3+4+5")
    visitor = JSONVisitor()
    json_str = visitor.visit(ast_tree)
    print(json.dumps(json_str, indent=4))

前面那個粗糙版本是直接從 Expr 開始的,這個優雅點的版本,我就把 Module 節點也添加進去了。

python的簡單四則運算語法樹可視化怎么實現

讀到這里,這篇“python的簡單四則運算語法樹可視化怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

游戏| 襄城县| 商水县| 翁牛特旗| 灵石县| 汉阴县| 富宁县| 象山县| 台中市| 濮阳县| 东乡| 大余县| 瓦房店市| 华阴市| 榕江县| 博爱县| 舞钢市| 石首市| 江孜县| 白玉县| 夹江县| 仙游县| 玉山县| 江西省| 扎兰屯市| 青海省| 廉江市| 张家界市| 伊宁市| 五河县| 城固县| 丰县| 东乡族自治县| 桑植县| 聂拉木县| 阿拉善左旗| 安丘市| 定南县| 涟水县| 宜黄县| 阿拉善盟|