1. Концепция
Абстрактное синтаксическое дерево (абстрактный синтаксический код, AST)исходный код抽象语法结构的树状表示
.这里特指编程语言的源代码。
Каждый узел дерева представляет структуру в исходном коде, которая является абстрактной, поскольку抽象语法树并不会表示出真实语法出现的每一个细节
, например, вложенные скобки неявно присутствуют в структуре дерева и не представлены в виде узлов.
抽象语法树
не зависит от грамматики исходного языка, т.语法分析
На этапе используется контекстно-свободная грамматика, т.к. при написании грамматики часто происходит эквивалентное преобразование грамматики (устранение левой рекурсии, возврат, двусмысленность и т.д.) Пагубные последствия и даже путаница на различных этапах. Поэтому многим компиляторам часто приходится строить деревья синтаксического анализа независимо друг от друга, чтобы установить четкий интерфейс для внешнего и внутреннего интерфейса.
Абстрактные синтаксические деревья широко используются во многих областях, таких как браузеры, интеллектуальные редакторы, компиляторы и т. д.
2. Зачем нужно абстрактное синтаксическое дерево (функция абстрактного синтаксического дерева)
Слишком много языков программирования, которые требуют единой структуры для распознавания компьютерами.
Функция: напримерtypescript
Проверка типов, подсветка синтаксиса IDE, проверка кода, перевод и т. д. — все это требует преобразования кода в AST для последующих операций.
3. Процесс генерации абстрактного синтаксического дерева (компиляция)
js в качестве примера:
词法分析(lexical analysis)
: Программа или функция, выполняющая лексический анализ, называется лексическим анализатором (лексический анализатор, сокращенно Lexer), также называется сканером (например, сканером).typescript
в исходном кодеscanner.ts
),字符流
преобразовать в соответствующийToken流
.
tokenize:
Токенизация — это разделение кода на «строки» одну за другой по определенным правилам, таким как токены-токены (обычно представляющие ключевые слова, имена переменных, синтаксические символы и т. д.), то есть синтаксические единицы). Когда дело доходит до лексического разбора, часто используется tokennize.
语法分析(parse analysis)
:является логическим этапом процесса компиляции. Задача синтаксического анализа состоит в том, чтобы на основе лексического анализа объединить последовательности слов в синтаксические деревья, такие как «программа», «инструкция», «выражение» и т. д. Синтаксический анализатор определяет, является ли исходная программа структурно правильной. Структура исходной программы описывается контекстно-свободной грамматикой.
Например: да
const a = 1;
const b = a + 1;
процесс компиляции.
Адрес карты:woohoo.process on.com/view/lincoln/5…
词法解析过程
: Сортировка при сканировании исходного кода, например, сканирование до первой строкиconst a = 1
, первое сканирование вconst
, создаст синтаксическую единицу, говорящую, что это ключевое словоconst
, затем отсканируйте вa
, которое является именем переменнойa
, а затем оператор=
, то постоянная1
и т. д., составляют поток токенов.
语法分析过程
: Преобразование потока маркеров в дерево, представляющее структуру синтаксиса программы, состоящую из вложенности на уровне элементов.Это дерево называется абстрактным синтаксическим деревом AST.
4. Расширенное тестирование: какconst a = 1
Конвертировано вvar a = 1
1. Создайте новыйtestAst
инженерия
mkdir testAst
testAst
под новымtest.js
документ
touch test.js
-
testAst
установить подesprima
модуль npm, получить AST
npm i esprima --save
test.js
написать код
const esprima = require('esprima');
let code = 'const a = 1';
const ast = esprima.parseScript(code);
console.log(ast);
2. Бегиtest.js
node test.js
3. Получите сгенерированный AST
также доступны черезESPRima.org/demo/parse. …, введите код для просмотра AST онлайн
-
testAst
установить подestraverse
Модуль npm, который проходит через обновленный AST
npm i estraverse --save
4. Измените код следующим образом:
const esprima = require('esprima');
const estraverse = require('estraverse');
let code = 'const a = 1';
const ast = esprima.parseScript(code);
estraverse.traverse(ast, {
enter: function (node) {
node.kind = "var";
}
});
console.log(ast);
5. Бегиtest.js
, получить обновленный AST
-
testAst
установить подescodegen
Модуль npm для получения транспилированного кода
npm i escodegen --save
6. Измените код следующим образом:
const esprima = require('esprima');
const estraverse = require('estraverse');
const escodegen = require('escodegen');
let code = 'const a = 1';
const ast = esprima.parseScript(code);
estraverse.traverse(ast, {
enter: function (node) {
node.kind = "var";
}
});
const transformCode = escodegen.generate(ast);
console.log(transformCode);
7. Бегиtest.js
, получить переведенный код
Справочная документация:
https://segmentfault.com/a/1190000012943992
- https://baike.baidu.com/item/parse/8853407?fr=aladdin
- baike.baidu.com/item/лексический анализ
- blog.CSDN.net/Wind 98 человек/Ах…
- https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md#toc-asts