Абстрактное синтаксическое дерево AST

внешний интерфейс
Абстрактное синтаксическое дерево AST


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, получить переведенный код



Справочная документация:

  1. https://segmentfault.com/a/1190000012943992

  2. https://baike.baidu.com/item/parse/8853407?fr=aladdin
  3. baike.baidu.com/item/лексический анализ
  4. blog.CSDN.net/Wind 98 человек/Ах…
  5. https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md#toc-asts