簡體   English   中英

什么是 AST 轉換?

[英]What is an AST transformation?

一般而言,什么是 AST 轉換? 我在閱讀Groovy博客時遇到了這些詞。 但它一般是什么?

AST 表示抽象語法樹,它基本上是代碼/任何語法結構的抽象表示。 轉換是修改這棵樹的動作(即將現有的 AST 轉換為新的 AST)。 有關更多信息,請查看此處: http://en.wikipedia.org/wiki/Abstract_syntax_tree

除了已經提到的內容之外,您可能還對術語重寫的更廣泛和更基本的概念感興趣。

簡單的答案是將一個 AST 轉換為另一個 AST 的任何 function。

在我關於模型驅動開發的 SO 答案中可以找到更復雜的視圖:什么是轉換?

AST是用編程語言編寫的源代碼的抽象句法結構的樹形表示。

當需要轉換代碼更改它的部分時, transformer器通常使用源代碼的樹表示來查找需要使用訪問者模式進行更改的節點並應用此更改。

例如JavaScript的輸出代碼轉換器支持以這種方式直接操作AST樹:

const putout = require('putout');

const removeDebugger = {
    report: () => 'debugger should not be used',
    fix: (path) => {
        path.remove();
    },
    traverse: ({push}) = ({
        'DebuggerStatement': (path) => {
            push(path);
        }
    }),
};

putout('const a = 5; debugger', {
    fix: true,
    plugins: [
        ['remove-debugger', removeDebugger]
    ]
});
// returns
({
    code: 'const a = 5;',
    places: [],
});

無論如何,使用@putout/plugin-remove-debugger中使用的 AST 有更簡單的操作方法:

const removeDebugger = {
    report: () => 'debugger should not be used',
    replace: () = ({
        'debugger': ''
    }),
};

在此示例中,使用@putout/engine-runner模板語言將一個表達式替換為另一個表達式,這有助於編寫簡單的代碼轉換,而無需觸及AST

值得一提的是,在replace轉換內部無論如何都使用了AST ,因為它是最強大的源代碼操作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM