Синтаксис конкретное дерево соответствует тому , что грамматика правила говорят синтаксис. Назначение абстрактного синтаксического дерева состоит в том, чтобы иметь «простое» представление того, что важно в «синтаксическом дереве».
Реальная ценность в АСТ ИМХО в том, что она меньше чем CST, и поэтому требует меньше времени для обработки. (Вы можете сказать, кого это волнует? Но я работаю с инструментом, в котором у нас одновременно живут десятки миллионов узлов!).
Большинство генераторов парсеров, которые поддерживают построение синтаксических деревьев, настаивают на том, чтобы вы лично указали, как именно они будут построены, исходя из предположения, что узлы вашего дерева будут «проще», чем CST (и в этом они в целом правы, поскольку программисты довольно ленивый). Возможно, это означает, что вам нужно кодировать меньше функций посетителя дерева, и это тоже ценно, поскольку сводит к минимуму инженерные затраты. Когда у вас есть 3500 правил (например, для COBOL), это имеет значение. И эта «простота» приводит к хорошему свойству «малости».
Но наличие таких AST создает проблему, которой не было: они не соответствуют грамматике, и теперь вы должны мысленно отслеживать их оба. И когда есть 1500 узлов AST для грамматики 3500 правил, это имеет большое значение. И если грамматика будет развиваться (а они всегда!), Теперь у вас есть два гигантских набора вещей, которые нужно синхронизировать.
Другое решение - позволить парсеру просто создавать для вас узлы CST и просто использовать их. Это огромное преимущество при построении грамматик: нет необходимости изобретать 1500 специальных узлов AST для моделирования 3500 грамматических правил. Только представьте, что дерево изоморфно грамматике. С точки зрения инженера-грамматика это совершенно безмозглый процесс, что позволяет ему сосредоточиться на правильной грамматике и взламывать ее сколько душе угодно. Возможно, вам придется написать больше правил для посетителей узла, но этим можно управлять. Подробнее об этом позже.
Что мы делаем с DMS Software Reengineering Toolkit, так это автоматически создаем CST на основе результатов процесса синтаксического анализа (GLR). Затем DMS автоматически создает "сжатый" CST из соображений экономии места, удаляя терминалы, не несущие значений (ключевые слова, знаки препинания), семантически бесполезные унарные продукты и формируя списки для пар грамматических правил, которые имеют список вроде:
L = e ;
L = L e ;
L2 = e2 ;
L2 = L2 ',' e2 ;
и самые разнообразные вариации таких форм. Вы думаете о правилах грамматики и виртуальном CST; инструмент работает со сжатым представлением. Легко для вашего мозга, быстрее / меньше во время выполнения.
Примечательно, что сжатый CST, созданный таким образом, очень похож на AST, который вы, возможно, создали вручную (см. Ссылку в конце примеров). В частности, сжатый CST не содержит узлов с конкретным синтаксисом. Есть небольшие неудобства: например, хотя конкретные узлы для '(' и ')', классически встречающиеся в подграмматиках выражений, не находятся в дереве, «узел скобок» действительно появляется в сжатом CST и требует обработки. У настоящего AST этого не было бы. Похоже, что это довольно небольшая цена за удобство, когда вообще не нужно указывать конструкцию AST. А документация к дереву всегда доступна и правильна: грамматика - это документация.
Как избежать «лишних посетителей»? Мы не совсем, но DMS предоставляет библиотеку AST, которая просматривает AST и прозрачно обрабатывает различия между CST и AST. DMS также предлагает оценщик "грамматики атрибутов" (AGE), который представляет собой метод передачи значений, вычисленных узлами вверх и вниз по дереву; AGE обрабатывает все проблемы с древовидным представлением, поэтому разработчик инструментов беспокоится только о том, чтобы эффективно писать вычисления непосредственно на самих правилах грамматики. Наконец, DMS также предоставляет шаблоны «поверхностного синтаксиса», которые позволяют фрагментам кода из грамматики использоваться для поиска определенных типов поддеревьев, не зная большинства задействованных типов узлов.
В одном из других ответов отмечается, что если вы хотите создать инструменты, которые могут восстанавливать исходный код, ваш AST должен будет соответствовать CST. Это не совсем так, но гораздо проще регенерировать источник, если у вас есть узлы CST. DMS генерирует большую часть prettyprinter автоматически, потому что имеет доступ к обоим: -}
Итог: AST хороши для небольших, как физических, так и концептуальных. Автоматизированное построение AST из CST обеспечивает и то, и другое, и позволяет избежать проблемы отслеживания двух разных наборов.
РЕДАКТИРОВАТЬ Март 2015 г .: Ссылка на примеры построения CST и AST таким образом