Чи генеруються вони різними фазами процесу компіляції? Або це просто різні назви одного і того ж?
Чи генеруються вони різними фазами процесу компіляції? Або це просто різні назви одного і того ж?
Відповіді:
Це базується на граматиці 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 парен немає, оскільки асоціації випливають із деревної структури.
Для більш детального пояснення див. Компілятори та генератори компіляторів, стор. 23
або Абстрактні синтаксичні дерева на стор. 21 у галузі синтаксису та семантики мов програмування
З того, що я розумію, AST більше зосереджується на абстрактних зв'язках між компонентами вихідного коду, тоді як дерево синтаксичного аналізу зосереджується на фактичній реалізації граматики, що використовується мовою, включаючи делікатні деталі. Вони точно не однакові, оскільки інший термін для "синтаксичного аналізу дерева" - це "дерево конкретного синтаксису".
Я знайшов цю сторінку, яка намагається вирішити саме це питання.
Книга DSL від Мартіна Фаулера це прекрасно пояснює. AST містить лише всі "корисні" елементи, які будуть використані для подальшої обробки, тоді як дерево синтаксичного аналізу містить усі артефакти (пробіли, дужки, ...) з оригінального документа, який ви аналізуєте
Візьміть завдання паскаля Вік: = 42;
Дерево синтаксису буде виглядати так само, як вихідний код. Нижче я ставлю дужки навколо вузлів. [Вік] [: =] [42] [;]
Абстрактне дерево буде виглядати так [=] [Вік] [42]
Завдання стає вузлом з 2 елементами, віком і 42. Ідея полягає в тому, що ви можете виконати завдання.
Також зверніть увагу, що синтаксис паскаля зникає. Таким чином, можливо, щоб більше однієї мови генерували однакові AST. Це корисно для міжмовних механізмів сценаріїв.
У дереві синтаксичного аналізу внутрішні вузли не є кінцевими, листя - кінцевими. У дереві синтаксису внутрішні вузли - оператор, листя - операнди.