38

一般而言,什么是 AST 转换?我在阅读Groovy博客时遇到了这些词。但它一般是什么?

4

4 回答 4

27

AST 表示抽象语法树,它基本上是代码/任何语法结构的抽象表示。转换是修改这棵树的动作(即将现有的 AST 转换为新的 AST)。有关更多信息,请查看此处:http ://en.wikipedia.org/wiki/Abstract_syntax_tree

于 2014-05-12T08:29:58.903 回答
7

除了已经提到的内容之外,您可能还对术语重写的更广泛和更基本的概念感兴趣。

于 2011-06-06T11:44:19.393 回答
5

简单的答案是将一个 AST 转换为另一个 AST 的任何函数。

在我关于模型驱动开发的 SO 答案中可以找到更复杂的视图:什么是转换?

于 2011-06-04T09:08:46.750 回答
0

AST是用编程语言编写的源代码的抽象句法结构的树形表示。

当需要转换代码更改时,它的部分通常transformer使用源代码的树表示来查找需要使用访问者模式进行更改的节点并应用此更改。

例如,用于 JavaScript 的putout代码转换器支持以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,因为它是最强大的源代码操作方式。

于 2021-03-19T11:48:21.913 回答