Я смущен относительно того, как представлять скобки в AST. Я знаю, как сделать дерево разбора, друг сказал мне, что AST не будет содержать скобки, которые я не могу проверить из каких-либо текстов.Как создать абстрактное синтаксическое дерево для * (b + c) * d
ответ
Ваш друг прав, абстрактное синтаксическое дерево не будет содержать круглые скобки. Круглые скобки управляют только структурой дерева, они сами не отображаются в дереве.
Так a*(b+c)
бы создать дерево где a
является левым потомком *
и право ребенка является еще одним поддеревом, где b
и c
являются детьми +
. В то время как a*b+c
(a*b)+c
и как бы создать дерево, где корень +
, *
с детьми a
и b
является левым потомком +
и c
является правильным ребенком +
.
, который я не могу проверить, из каких-либо текстов
из Wikipedia article на абстрактных синтаксических деревьев:
Синтаксис является «абстрактным» в не представляя каждую деталь, появляющийся в реальном синтаксис. Например, группирующие скобки неявны в древовидной структуре
Стандартная мудрость для АСТ заключается в том, что они не содержат круглых скобок из выражений. Это на самом деле просто вопрос вкуса. Вы можете сделать это в любом случае.
Пункт абстракции: деталь отбрасывается.
Можно было бы отказаться от других деталей, чем круглые скобки; вы все равно получаете абстрактное синтаксическое дерево. В качестве примера, если вы берете полностью конкретное дерево синтаксиса и удаляете все терминальные узлы с фиксированными написаниями (в том числе «+», «IF» и «(»), вы получаете тонкое абстрактное синтаксическое дерево.
Я строю анализ программы и преобразования инструмент, который делает этот вид абстракции (и некоторые другие) автоматически из необработанного грамматики Она имеет некоторые очень хорошие преимущества:.
При построении парсер из грамматики, вы можете автоматически создайте AST без ручного написания кода. Это действительно имеет значение при создании и поддержании большой грамматики, такой как C++ 14 и IBM COBOL. Да, узел (...) отображается в дереве, но конкретные жетоны для '('и') 'не делают.
Легче восстановить исходный текст из АСТ автоматически. Если вы не держите круглые скобки вокруг, это немного сложно восстановить там, где их нужно вставлять, когда красиво печатается.
Если вы пишете шаблоны и преобразования кода в поверхностном синтаксисе интересующего нас диапазона (что мы делаем), вы все равно пишете их круглыми скобками. И совпадению все равно, нужно ли ему сопоставлять «лишний» узел. Поэтому при использовании деревьев это в основном не проблема. (Время от времени мы будем писать правила, которые удаляют вложенные круглые скобки, но это довольно просто написать).
- 1. Как построить абстрактное синтаксическое дерево
- 2. Parser и абстрактное синтаксическое дерево
- 3. абстрактное синтаксическое дерево для императивных языков
- 4. Как получить абстрактное синтаксическое дерево из ParseResults
- 5. AST (абстрактное синтаксическое дерево) в Netbeans
- 6. python: получить абстрактное синтаксическое дерево импортируемой функции?
- 7. Как получить абстрактное синтаксическое дерево программы `c` в` GCC`
- 8. Как уменьшить дерево синтаксического анализа в абстрактное синтаксическое дерево?
- 9. Анализ кода взлома в абстрактное синтаксическое дерево
- 10. Абстрактное синтаксическое дерево в C++: classes vs. structs
- 11. Как разработать AST (абстрактное синтаксическое дерево) для XPath?
- 12. Представление множественного прохода Абстрактное синтаксическое дерево (AST) в C++?
- 13. Абстрактное синтаксическое дерево в компиляторе: как точно представлять функцию?
- 14. Как показать абстрактное синтаксическое дерево грамматики в бизоне?
- 15. Как пропустить типизированное абстрактное синтаксическое дерево в компиляторе OCaml
- 16. Как объяснить абстрактное синтаксическое дерево прикованных операций сравнения?
- 17. Как перевести LR (1) Разбор в абстрактное синтаксическое дерево?
- 18. Интерпретатор бэкэнда, как вы проходите свое абстрактное синтаксическое дерево?
- 19. анализ кода JavaScript, абстрактное синтаксическое дерево и прочее
- 20. LR (1) разобрать прямо на абстрактное синтаксическое дерево
- 21. Синтаксический разметки в абстрактное синтаксическое дерево с помощью регулярного выражения
- 22. код генерации JUnit на основе абстрактное синтаксическое дерево ходьбы
- 23. Использование C# и gppg, как бы я построил абстрактное синтаксическое дерево?
- 24. Как генерировать AST (абстрактное синтаксическое дерево) для исходного кода Python с использованием antlr
- 25. Абстрактное дерево против дерева парсеров
- 26. Здание Аннотация Синтаксическое дерево
- 27. Java-алгоритм для «умножения» двух списков списков ((A), (B)) * ((C, C), (D, D)) == ((A, C, C), (A, D, D), (B, C, C), (B, D, D))
- 28. Как построить синтаксическое дерево Roslyn с нуля?
- 29. C-программа для C++ B + Дерево
- 30. Как создать абстрактное дерево синтаксиса с учетом '|'? (Ply/Yacc)