Chúng được tạo ra bởi các giai đoạn khác nhau của quá trình biên dịch? Hay chúng chỉ là những cái tên khác nhau cho cùng một thứ?
Chúng được tạo ra bởi các giai đoạn khác nhau của quá trình biên dịch? Hay chúng chỉ là những cái tên khác nhau cho cùng một thứ?
Câu trả lời:
Điều này dựa trên ngữ pháp Công cụ đánh giá biểu thức của Terrence Parr.
Ngữ pháp cho ví dụ này:
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(); } ;
Đầu vào
x=1
y=2
3*(x+y)
Cây phân tích cú pháp
Cây phân tích cú pháp là một đại diện cụ thể của đầu vào. Cây phân tích cú pháp giữ lại tất cả thông tin của đầu vào. Các ô trống đại diện cho khoảng trắng, tức là cuối dòng.
AST
AST là một đại diện trừu tượng của đầu vào. Lưu ý rằng parens không có trong AST vì các liên kết có thể bắt nguồn từ cấu trúc cây.
Để biết thêm thông qua giải thích, hãy xem Trình biên dịch và Trình tạo trình biên dịch trang pg. 23
hoặc Cây cú pháp trừu tượng trên pg. 21 trong Cú pháp và Ngữ nghĩa của Ngôn ngữ Lập trình
Theo những gì tôi hiểu, AST tập trung nhiều hơn vào các mối quan hệ trừu tượng giữa các thành phần của mã nguồn, trong khi cây phân tích cú pháp tập trung vào việc triển khai thực tế ngữ pháp được ngôn ngữ sử dụng, bao gồm cả các chi tiết phức tạp. Chúng chắc chắn không giống nhau, vì một thuật ngữ khác cho "cây phân tích cú pháp" là "cây cú pháp cụ thể".
Tôi tìm thấy trang này cố gắng giải quyết câu hỏi chính xác này.
Các cuốn sách DSL từ Martin Fowler giải thích độc đáo này. AST chỉ chứa tất cả các phần tử 'hữu ích' sẽ được sử dụng để xử lý thêm, trong khi cây phân tích cú pháp chứa tất cả các phần tử tạo tác (dấu cách, dấu ngoặc, ...) từ tài liệu gốc mà bạn phân tích cú pháp
Làm phép gán pascal Tuổi: = 42;
Cây cú pháp sẽ giống như mã nguồn. Dưới đây tôi đặt dấu ngoặc quanh các nút. [Tuổi] [: =] [42] [;]
Một cây trừu tượng sẽ trông như thế này [=] [Age] [42]
Phép gán sẽ trở thành một nút có 2 phần tử, Tuổi và 42. Ý tưởng là bạn có thể thực hiện phép gán.
Cũng lưu ý rằng cú pháp pascal sẽ biến mất. Do đó, có thể có nhiều ngôn ngữ tạo cùng một AST. Điều này rất hữu ích cho các công cụ tập lệnh đa ngôn ngữ.
Trong phân tích cú pháp các nút bên trong cây không phải là thiết bị đầu cuối, các lá là thiết bị đầu cuối. Trong cây cú pháp, các nút bên trong là toán tử, các lá là toán hạng.