Все синтаксические деревья разбора / деривации / конкретного синтаксиса являются синонимами одного и того же понятия.
Такие деревья обычно используются только в теоретических обсуждениях, потому что они содержат много деталей, которые кажутся ненужными для обработки языка; в дереве выражений вам действительно нужен узел для представления "(" и другой для представления ")"?
Понятие дерева "абстрактный синтаксис" - это такое, которое представляет структуру программы с уровнем детализации, достаточным для обработки на практике; вы обычно не находите узлы для "(...)".
Интересный вопрос: является ли AST вычисляемым напрямую из CST? Ответ должен быть да, но люди вряд ли когда-либо делают это. Обычно они создают узлы «абстрактного синтаксиса» во время работы синтаксического анализатора и используют специальное (процедурное вложение сокращения правил) для сборки узлов из дочерних разборов с помощью связующего узла для родителя. ИМХО, они делают это, потому что мы все воспитаны на YACC, и именно так это традиционно делается. (Мы также зажигали огни с кремнем.) Есть меньшее оправдание; Делая это таким образом, вы получаете полный контроль над структурой AST компилятором, и он может создать тот, который является минимальным с точки зрения дополнительных деталей.
Такое специальное дерево не вычисляется из CST, за исключением тех же специальных вычислений, которые встроены в действия синтаксического анализатора.
Я использовал другой подход: мои инструменты вычисляют AST напрямую из CSTs, буквально отбрасывая нерелевантные детали, например, оставляя узлы, которые представляют токены, не имеющие значения (например, те, которые бессмысленны '( '') 'токены, а также ключевые слова), сжимающие строки унарных производств, и преобразовывающие правые или левые деревья, эквивалентные спискам, в реальные узлы списков. Преимущество этого заключается в том, что синтаксический анализатор может вычислять AST непосредственно из правил грамматики. Не возиться с процедурными вложениями. Не поймите это неправильно. Больше не нужно беспокоиться о том, что наша грамматика COBOL имеет 3500 правил, и в противном случае мне понадобится процедурное сгущение для каждого из них, и что мне придется сотни раз менять свою грамматику, чтобы сделать ее правильной и возиться с слизь каждый раз. А наши инструменты работают так, как будто они работают непосредственно с CST, что позволяет легко думать о древовидных манипуляциях, особенно если вы смотрите прямо на правила грамматики.
(Это также значительно упрощает сопоставление с шаблоном с использованием поверхностного синтаксиса: для любого фрагмента шаблона имеется непосредственно вычисляемый AST, который соответствует).
Таким образом, различие между AST и CST является реальным с точки зрения полезности. Но я думаю, что их следует рассматривать как просто изоморфные представления.