Яка різниця між деревом синтаксичного аналізу та AST?


94

Чи генеруються вони різними фазами процесу компіляції? Або це просто різні назви одного і того ж?


Дерево синтаксичного аналізу - це результат вашої граматики з її артефактами (ви можете писати нескінченність граматик для тієї самої мови), AST зменшує дерево синтаксичного аналізу якнайближче до мови. Кілька граматик для однієї мови дадуть різні дерева синтаксичного аналізу, але повинні привести до одного і того ж AST. (Ви також можете зменшити різні сценарії (різні дерева синтаксичного аналізу з тієї самої граматики) до одного і того ж AST)
Гійом86

1
Цей SO відповідь обговорює Різницеві в деталях: stackoverflow.com/a/1916687/120163
Ira Baxter

Відповіді:


98

Це базується на граматиці Expression Evaluator Терренса Парра.

Граматика для цього прикладу:

grammar Expr002;

options 
{
    output=AST;
    ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}

prog    :   ( stat )+ ;

stat    :   expr NEWLINE        -> expr
        |   ID '=' expr NEWLINE -> ^('=' ID expr)
        |   NEWLINE             ->
        ;

expr    :   multExpr (( '+'^ | '-'^ ) multExpr)*
        ; 

multExpr
        :   atom ('*'^ atom)*
        ; 

atom    :   INT 
        |   ID
        |   '('! expr ')'!
        ;

ID      : ('a'..'z' | 'A'..'Z' )+ ;
INT     : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS      : ( ' ' | '\t' )+ { skip(); } ;

Вхідні дані

x=1
y=2
3*(x+y)

Розбір дерева

Дерево синтаксичного аналізу є конкретним поданням вхідних даних. Дерево розбору зберігає всю інформацію, що вводиться. Порожні поля представляють пробіли, тобто кінець рядка.

Розбір дерева

AST

AST є абстрактним поданням вхідних даних. Зверніть увагу, що в AST парен немає, оскільки асоціації випливають із деревної структури.

AST

Для більш детального пояснення див. Компілятори та генератори компіляторів, стор. 23
або Абстрактні синтаксичні дерева на стор. 21 у галузі синтаксису та семантики мов програмування


5
Як ви отримуєте AST з дерева синтаксичного аналізу? Який метод спрощення дерева синтаксичного аналізу в AST?
CMCDragonkai

3
Не існує конкретного алгоритму для отримання AST з дерева синтаксичного аналізу. Що стосується AST, це більше особисті уподобання, але воно повинно містити достатньо інформації для виконання завдання. Я виключив парен з AST, використовуючи ANTLR ! оператора в граматиці, оскільки вони не потрібні, але за замовчуванням ANTLR включив би їх. Я думаю, що дерево синтаксичного аналізу дає вам все, незалежно від того, потрібно це вам чи ні, а AST - як мінімальний мінімум. Пам’ятайте, що ви будете багато перетинати дерева, тому розмір має значення.
Guy Coder

2
Ви маєте на увазі, як CST (конкретне дерево синтаксису) проти AST (дерево абстрактного синтаксису)?
CMCDragonkai

Семантичні дії / правила, вбудовані у файли синтаксису синтаксичного аналізатора або генератора синтаксичного аналізатора, є звичайним способом семантичного аналізу та створення AST, тоді як дерево синтаксичного аналізу рідко, коли-небудь створюється або використовується користувацьким кодом, за винятком, можливо, для перевірки правильності аналізатора.


16

З того, що я розумію, AST більше зосереджується на абстрактних зв'язках між компонентами вихідного коду, тоді як дерево синтаксичного аналізу зосереджується на фактичній реалізації граматики, що використовується мовою, включаючи делікатні деталі. Вони точно не однакові, оскільки інший термін для "синтаксичного аналізу дерева" - це "дерево конкретного синтаксису".

Я знайшов цю сторінку, яка намагається вирішити саме це питання.


11

Книга DSL від Мартіна Фаулера це прекрасно пояснює. AST містить лише всі "корисні" елементи, які будуть використані для подальшої обробки, тоді як дерево синтаксичного аналізу містить усі артефакти (пробіли, дужки, ...) з оригінального документа, який ви аналізуєте


4

Візьміть завдання паскаля Вік: = 42;

Дерево синтаксису буде виглядати так само, як вихідний код. Нижче я ставлю дужки навколо вузлів. [Вік] [: =] [42] [;]

Абстрактне дерево буде виглядати так [=] [Вік] [42]

Завдання стає вузлом з 2 елементами, віком і 42. Ідея полягає в тому, що ви можете виконати завдання.

Також зверніть увагу, що синтаксис паскаля зникає. Таким чином, можливо, щоб більше однієї мови генерували однакові AST. Це корисно для міжмовних механізмів сценаріїв.


1

У дереві синтаксичного аналізу внутрішні вузли не є кінцевими, листя - кінцевими. У дереві синтаксису внутрішні вузли - оператор, листя - операнди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.