Синтаксис конкретне дерево відповідає тому , що граматика правила говорять синтаксис. Метою абстрактного дерева синтаксису є "просте" представлення того, що є важливим у "дереві синтаксису".
Реальне значення в AST IMHO полягає в тому, що воно менше, ніж CST, і тому його обробка займає менше часу. (Можна сказати, кого це цікавить? Але я працюю з інструментом, де у нас живуть відразу десятки мільйонів вузлів!).
Більшість генераторів аналізаторів, які мають будь-яку підтримку для побудови дерев синтаксису, наполягають на тому, щоб ви особисто вказали, як саме вони будуються, припускаючи, що ваші дерева-вузли будуть "простішими", ніж CST (і в цьому, як правило, вони мають рацію, оскільки програмісти досить ледачий). Можливо, це означає, що вам доводиться кодувати менше функцій відвідувачів дерева, і це також цінне тим, що воно мінімізує енергетичну енергію. Коли у вас є 3500 правил (наприклад, для COBOL), це має значення. І ця «простіша» суть призводить до доброї властивості «маленькості».
Але наявність таких AST створює проблему, якої не було: вона не відповідає граматиці, і тепер вам доведеться подумки відстежувати їх обох. І коли для граматики 3500 правил існує 1500 вузлів AST, це має велике значення. І якщо граматика розвивається (вони завжди це роблять!), Тепер у вас є два гігантські набори речей, які слід синхронізувати.
Інше рішення - дозволити синтаксичному аналізатору просто будувати для вас вузли CST і просто використовувати їх. Це величезна перевага при побудові граматики: немає необхідності винаходити 1500 спеціальних вузлів AST для моделювання 3500 граматичних правил. Подумайте лише про те, що дерево ізоморфне граматиці. З точки зору інженера-граматика, це абсолютно безмозково, що дозволяє йому зосередитись на тому, щоб граматика була правильною, і хакнути її до душі. Можливо, вам доведеться писати більше правил відвідувачів вузлів, але цим можна керувати. Про це далі.
Що ми робимо з набором інструментів реінжинірингу програмного забезпечення DMS, це автоматичне створення 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 генерує більшу частину доситьпринтера автоматично, оскільки він має доступ до обох: -}
Підсумок: AST корисні для малих, як фіскальних, так і концептуальних. Автоматизована побудова AST від CST забезпечує обидва варіанти та дозволяє уникнути проблеми відстеження двох різних наборів.
EDIT березень 2015: Посилання на приклади CST проти "AST", побудовані таким чином