Что такое преобразование 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
потому что это самый мощный способ манипулирования исходным кодом.