A бетонное синтаксическое дерево соответствует тому, что говорят правила грамматики, является синтаксисом. Цель абстрактного синтаксического дерева имеет «простое» представление того, что необходимо в «синтаксическом дереве».
Реальное значение в AST IMHO заключается в том, что оно является меньшим, чем CST, и поэтому занимает меньше времени для обработки. (Можно сказать, кому это нужно? Но я работаю с инструментом, где у нас есть десятки миллионов узлов, живущих сразу!).
Большинство генераторов парсеров, которые имеют любую поддержку для построения синтаксических деревьев, настаивают на том, что вы точно определяете, как они создаются в предположении, что ваши узлы дерева будут «проще», чем CST (и в этом они, как правило, поскольку программисты довольно ленивы). Возможно, это означает, что вам нужно закодировать меньше функций посетителя дерева, и это тоже ценно, поскольку оно минимизирует инженерную энергию. Если у вас есть 3500 правил (например, для COBOL), это имеет значение. И это «более простое» приводит к хорошей собственности «малости».
Но наличие таких АСТ создает проблему, которой ее не было: она не соответствует грамматике, и теперь вы должны мысленно отслеживать их оба. И когда есть 1500 узлов AST для 3500 грамматики правил, это очень важно. И если грамматика эволюционирует (они всегда делают!), Теперь у вас есть два гигантских набора вещей, чтобы синхронизировать их.
Другое решение - позволить парсеру просто создавать узлы CST для вас и просто использовать их. Это огромное преимущество при построении грамматик: нет необходимости изобретать 1500 специальных узлов АСТ для моделирования правил грамматики 3500. Подумайте о том, что дерево изоморфно грамматике. С точки зрения инженера-грамматики это совершенно безмозгло, что позволяет ему сосредоточиться на правильном использовании грамматики и взломать ее до глубины души. Возможно, вам нужно написать больше правил для посетителей узлов, но это можно управлять. Подробнее об этом позже.
Что мы делаем с DMS Software Reengineering Toolkit - это автоматическое построение CST на основе результатов анализа (GLR). DMS автоматически строит «сжатый» CST по соображениям экономии пространства, за счет устранения не-балансовая стоимость терминалов (ключевые слова, точечностью), семантически бесполезные одинарные производств и формирования списков для пар правил грамматики, которые список, как:
L = e ;
L = L e ;
L2 = e2 ;
L2 = L2 ',' e2 ;
и широкий спектр вариантов таких форм. Вы думаете с точки зрения правил грамматики и виртуального КНТ; инструмент работает с сжатым представлением. Легко на вашем мозгу, быстрее/меньше во время работы.
Замечательно, что сжатый CST, построенный таким образом, выглядит много AST, который вы, возможно, разработали вручную (см. Ссылку в конце на примеры). В частности, сжатый CST не несет никаких узлов, которые являются просто конкретным синтаксисом. Есть небольшие кусочки неловкости: например, в то время как конкретные узлы для '(' и ')', классически найденные в подграфах выражений, не находятся в дереве, в скобках CST появляется «круглые скобки» и должен быть обрабатываются. Истинный АСТ не имел бы этого. Это похоже на довольно небольшую цену, чтобы заплатить за удобство, чтобы не указывать конструкцию AST. И документация для дерева всегда доступна и правильная: грамматика - это документация.
Как избежать «дополнительных посетителей»? Мы не полностью, но DMS предоставляет библиотеку AST, которая проходит AST и обрабатывает различия между CST и AST прозрачно. DMS также предлагает оценщик грамматики атрибутов (AGE), который является методом передачи значений, вычисляемых узлами вверх и вниз по дереву; AGE обрабатывает все проблемы с представлением дерева, и поэтому инженер-программист беспокоится о том, чтобы непосредственно писать вычисления непосредственно по самим правилам грамматики. Наконец, DMS также предоставляет шаблоны «поверхностный синтаксис», которые позволяют фрагментам кода из грамматики использоваться для поиска определенных типов поддеревьев, не зная большинства задействованных типов узлов.
Один из других ответов отмечает, что если вы хотите создавать инструменты, которые могут восстанавливать источник, ваш АСТ должен соответствовать КНТ. Это не совсем так, но гораздо проще восстановить источник, если у вас есть узлы CST. DMS generates most of the prettyprinter automatically, поскольку он имеет доступ к обоим: -}
Итог: АСТы хороши для малых, как фискальных, так и концептуальных. Автоматизированная конструкция AST из CST обеспечивает и то и другое, и позволяет избежать проблемы отслеживания двух разных наборов.
EDIT марта 2015: Link to examples of CST vs. "AST" built this way
поэтому мы создаем настоящий АСТ в коде? – Joey