2

Я смущен относительно того, как представлять скобки в AST. Я знаю, как сделать дерево разбора, друг сказал мне, что AST не будет содержать скобки, которые я не могу проверить из каких-либо текстов.Как создать абстрактное синтаксическое дерево для * (b + c) * d

ответ

2

Ваш друг прав, абстрактное синтаксическое дерево не будет содержать круглые скобки. Круглые скобки управляют только структурой дерева, они сами не отображаются в дереве.

Так a*(b+c) бы создать дерево где a является левым потомком * и право ребенка является еще одним поддеревом, где b и c являются детьми +. В то время как a*b+c(a*b)+c и как бы создать дерево, где корень +, * с детьми a и b является левым потомком + и c является правильным ребенком +.

, который я не могу проверить, из каких-либо текстов

из Wikipedia article на абстрактных синтаксических деревьев:

Синтаксис является «абстрактным» в не представляя каждую деталь, появляющийся в реальном синтаксис. Например, группирующие скобки неявны в древовидной структуре

1

Стандартная мудрость для АСТ заключается в том, что они не содержат круглых скобок из выражений. Это на самом деле просто вопрос вкуса. Вы можете сделать это в любом случае.

Пункт абстракции: деталь отбрасывается.

Можно было бы отказаться от других деталей, чем круглые скобки; вы все равно получаете абстрактное синтаксическое дерево. В качестве примера, если вы берете полностью конкретное дерево синтаксиса и удаляете все терминальные узлы с фиксированными написаниями (в том числе «+», «IF» и «(»), вы получаете тонкое абстрактное синтаксическое дерево.

Я строю анализ программы и преобразования инструмент, который делает этот вид абстракции (и некоторые другие) автоматически из необработанного грамматики Она имеет некоторые очень хорошие преимущества:.

  • При построении парсер из грамматики, вы можете автоматически создайте AST без ручного написания кода. Это действительно имеет значение при создании и поддержании большой грамматики, такой как C++ 14 и IBM COBOL. Да, узел (...) отображается в дереве, но конкретные жетоны для '('и') 'не делают.

  • Легче восстановить исходный текст из АСТ автоматически. Если вы не держите круглые скобки вокруг, это немного сложно восстановить там, где их нужно вставлять, когда красиво печатается.

  • Если вы пишете шаблоны и преобразования кода в поверхностном синтаксисе интересующего нас диапазона (что мы делаем), вы все равно пишете их круглыми скобками. И совпадению все равно, нужно ли ему сопоставлять «лишний» узел. Поэтому при использовании деревьев это в основном не проблема. (Время от времени мы будем писать правила, которые удаляют вложенные круглые скобки, но это довольно просто написать).

Смежные вопросы