Что такое преобразование AST?

Что такое преобразование AST в целом? Я сталкивался с этими словами при чтении блога Groovy. Но что это вообще?

4 ответа

AST означает абстрактное синтаксическое дерево, которое в основном является абстрактным представлением кода / любой синтаксической структуры. Преобразование - это действие, изменяющее это дерево (т.е. преобразование существующего AST в новое AST). Для получения дополнительной информации посмотрите здесь: http://en.wikipedia.org/wiki/Abstract_syntax_tree

В дополнение к тому, что уже было упомянуто, вас также может заинтересовать более широкая и фундаментальная концепция переписывания терминов.

Простой ответ - любая функция, которая преобразует один AST в другой AST.

Более сложный взгляд можно найти в моем SO-ответе о разработке на основе моделей: что такое трансформация?

AST - это древовидное представление абстрактной синтаксической структуры исходного кода, написанного на языке программирования.

Когда возникает необходимость трансформировать код, меняя его части, обычно transformerработает с древовидным представлением исходного кода, чтобы найти узел, требующий изменений, с помощью шаблона посетителя и применить эти изменения.

Например, преобразователь кода вывода для JavaScript поддерживает прямое управление деревом следующим образом:

      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: [],
});

В любом случае есть гораздо более простой способ манипулировать с помощью AST, используемого в @ putout / plugin-remove-debugger:

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

В этом примере одно выражение заменяется другим с использованием шаблонов языка из @ putout / двигатель бегуна , который помогает писать простой код преобразования , не касаясь вообще.

Стоит отметить, что внутри replace трансформация в любом случае использовалась AST потому что это самый мощный способ манипулирования исходным кодом.

Другие вопросы по тегам