Jump to content

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

Абстрактное синтаксическое дерево для следующего кода алгоритма Евклида :
while b  0:
    if a > b:
        a := a - b
    else:
        b := b - a
return a

Абстрактное синтаксическое дерево ( AST ) — это структура данных, используемая в информатике для представления структуры программы или фрагмента кода. Это древовидное представление абстрактной синтаксической структуры текста (часто исходного кода ), написанного на формальном языке . Каждый узел дерева обозначает конструкцию, встречающуюся в тексте. Иногда его называют просто синтаксическим деревом .

Синтаксис является «абстрактным» в том смысле, что он не представляет все детали реального синтаксиса, а лишь структурные или связанные с содержанием детали. Например, группирующие круглые скобки неявно присутствуют в древовидной структуре, поэтому их не обязательно представлять как отдельные узлы. Аналогично, синтаксическая конструкция, такая как оператор if-condition-then, может быть обозначена посредством одного узла с тремя ветвями.

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

Абстрактные синтаксические деревья также используются в системах анализа и преобразования программ .

Применение в компиляторах

[ редактировать ]

Абстрактные синтаксические деревья — это структуры данных , широко используемые в компиляторах для представления структуры программного кода. AST обычно является результатом фазы синтаксического анализа компилятора. Он часто служит промежуточным представлением программы на нескольких этапах, необходимых компилятору, и оказывает сильное влияние на конечный результат компилятора.

Мотивация

[ редактировать ]

AST имеет несколько свойств, которые помогают на дальнейших этапах процесса компиляции:

  • AST можно редактировать и расширять, добавляя такую ​​информацию, как свойства и аннотации для каждого содержащегося в нем элемента. Такое редактирование и аннотирование невозможно с исходным кодом программы, поскольку это влечет за собой его изменение.
  • По сравнению с исходным кодом AST не содержит несущественных знаков препинания и разделителей (фигурные скобки, точки с запятой, круглые скобки и т. д.).
  • AST обычно содержит дополнительную информацию о программе из-за последовательных этапов анализа компилятора. Например, он может хранить позицию каждого элемента в исходном коде, позволяя компилятору печатать полезные сообщения об ошибках.

AST необходимы из-за неотъемлемой природы языков программирования и их документации. Языки часто неоднозначны по своей природе. Чтобы избежать этой двусмысленности, языки программирования часто определяют как контекстно-свободную грамматику (CFG). Однако часто существуют аспекты языков программирования, которые CFG не может выразить, но являются частью языка и документированы в его спецификации. Это детали, которые требуют контекста для определения их достоверности и поведения. Например, если язык позволяет объявлять новые типы, CFG не может предсказать ни имена таких типов, ни способ их использования. Даже если в языке есть предопределенный набор типов, для обеспечения правильного использования обычно требуется некоторый контекст. Другой пример — утиная типизация , где тип элемента может меняться в зависимости от контекста. Перегрузка операторов — это еще один случай, когда правильное использование и конечная функция зависят от контекста.

Проектирование AST часто тесно связано с проектированием компилятора и его ожидаемыми функциями.

Основные требования включают следующее:

  • Типы переменных должны быть сохранены, а также расположение каждого объявления в исходном коде.
  • Порядок исполняемых операторов должен быть явно представлен и четко определен.
  • Левая и правая компоненты бинарных операций должны храниться и правильно идентифицироваться.
  • Идентификаторы и присвоенные им значения должны храниться для операторов присваивания.

Эти требования можно использовать для разработки структуры данных для AST.

Некоторые операции всегда требуют двух элементов, например двух условий для сложения. Однако некоторые языковые конструкции требуют сколь угодно большого числа дочерних элементов, например списки аргументов, передаваемые программам из командной оболочки . В результате AST, используемый для представления кода, написанного на таком языке, также должен быть достаточно гибким, чтобы обеспечить быстрое добавление неизвестного количества дочерних элементов.

Для поддержки проверки компилятора должна быть возможность разобрать AST в форму исходного кода. Созданный исходный код должен быть достаточно похож на оригинал по внешнему виду и идентичн по исполнению после перекомпиляции. AST интенсивно используется при семантическом анализе , где компилятор проверяет правильность использования элементов программы и языка. Компилятор также генерирует таблицы символов на основе AST в ходе семантического анализа. Полный обход дерева позволяет проверить корректность программы.

После проверки правильности AST служит основой для генерации кода. AST часто используется для создания промежуточного представления (IR), иногда называемого промежуточным языком , для генерации кода.

Другое использование

[ редактировать ]

Разница AST

[ редактировать ]

Разность AST или разность коротких деревьев состоит из вычисления списка различий между двумя AST. [1] Этот список различий обычно называется сценарием редактирования. Сценарий редактирования напрямую ссылается на AST кода. Например, действие редактирования может привести к добавлению нового узла AST, представляющего функцию.

Обнаружение клонов

[ редактировать ]

AST — это мощная абстракция для обнаружения клонов кода . [2]

См. также

[ редактировать ]
  1. ^ Флури, Бит; Вурш, Майкл; Пинцгер, Мартин; Галл, Харальд (2007). «Перегонка изменений: дифференцирование деревьев для детального извлечения изменений исходного кода» . Транзакции IEEE по разработке программного обеспечения . 33 (11): 725–743. дои : 10.1109/tse.2007.70731 . ISSN   0098-5589 . S2CID   13659557 .
  2. ^ Кошке, Райнер; Фальке, Раймар; Френцель, Пьер (2006). «Обнаружение клонов с использованием абстрактных синтаксических суффиксных деревьев» . 2006 13-я рабочая конференция по обратному проектированию . IEEE. стр. 253–262. дои : 10.1109/wcre.2006.18 . ISBN  0-7695-2719-1 . S2CID   6985484 .

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 02438cb57b3eae43302b7f3d9294e316__1712124840
URL1:https://arc.ask3.ru/arc/aa/02/16/02438cb57b3eae43302b7f3d9294e316.html
Заголовок, (Title) документа по адресу, URL1:
Abstract syntax tree - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)