Насколько я понимаю, парсер создает дерево разбора, а затем отбрасывает его. Тем не менее, он также может вызвать абстрактное синтаксическое дерево, которое предположительно использует компилятор.
У меня сложилось впечатление, что и дерево синтаксического анализа, и абстрактное синтаксическое дерево создаются на этапе синтаксического анализа. Тогда кто-то может объяснить, почему они разные?
Ответы:
Дерево разбора также известно как конкретное синтаксическое дерево.
По сути, абстрактное дерево содержит меньше информации, чем конкретное дерево. Конкретное дерево содержит каждый элемент языка, в то время как абстрактное дерево отбрасывает неинтересные фрагменты.
Например выражение:
(2 + 5) * 8
Бетон выглядит так
В то время как абстрактное дерево имеет:
В конкретных случаях круглые скобки и все части языка были включены в дерево. В абстрактном случае скобки исчезли, потому что их информация была включена в древовидную структуру.
источник
Первое, что вам нужно понять, это то, что никто не заставляет вас писать синтаксический анализатор или компилятор определенным образом. В частности, это не обязательно тот случай, когда результатом парсера должно быть дерево. Это может быть любая структура данных, которая подходит для представления ввода.
Например, следующий язык:
может быть представлен в виде списка определений. (Nitpickers укажет, что список является вырожденным деревом, но в любом случае.)
Во-вторых, нет необходимости держать дерево синтаксического анализа (или какую-либо структуру данных, возвращенную анализатором). Напротив, компиляторы обычно конструируются как последовательность проходов, которые преобразуют результаты предыдущего прохода. Следовательно, общая компоновка компилятора может быть такой:
Итог: если вы слышите, как люди говорят о деревьях разбора , абстрактных синтаксических деревьях , конкретных синтаксических деревьях и т. Д., Всегда заменяйте их структурой данных, подходящей для данной цели , и все в порядке.
источник