Sự khác biệt giữa cây phân tích cú pháp và AST là gì?


90

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ây phân tích cú pháp là kết quả của ngữ pháp của bạn với các tạo tác của nó (bạn có thể viết vô số ngữ pháp cho cùng một ngôn ngữ), AST giảm Cây phân tích cú pháp gần nhất có thể với ngôn ngữ. Một số ngữ pháp cho cùng một ngôn ngữ sẽ cung cấp các cây phân tích cú pháp khác nhau nhưng sẽ dẫn đến cùng một AST. (bạn cũng có thể làm giảm các kịch bản khác nhau (cây phân tích cú pháp khác nhau so với cùng ngữ pháp) cho AST cùng)
Guillaume86

1
Câu trả lời SO này thảo luận về dfference một cách chi tiết: stackoverflow.com/a/1916687/120163
Ira Baxter

Câu trả lời:


95

Đ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.

Cây phân tích cú pháp

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.

AST

Để 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


5
Làm thế nào để bạn lấy AST từ cây phân tích cú pháp? Phương pháp đơn giản hóa cây phân tích cú pháp thành AST là gì?
CMCDragonkai

3
Không có thuật toán cụ thể nào để lấy AST từ cây phân tích cú pháp. Những gì đi vào AST là sở thích cá nhân nhưng phải chứa đủ thông tin để hoàn thành nhiệm vụ. Tôi đã loại trừ các parens khỏi AST bằng cách sử dụng ANTLR ! toán tử trong ngữ pháp vì chúng không cần thiết, nhưng theo mặc định, ANTLR sẽ bao gồm chúng. Tôi nghĩ về cây phân tích cú pháp là cung cấp cho bạn mọi thứ cho dù bạn cần hay không, và AST là cung cấp cho bạn mức tối thiểu trần. Hãy nhớ rằng bạn sẽ đi qua cây rất nhiều, vì vậy kích thước rất quan trọng.
Guy Coder

2
Ý bạn là như CST (cây cú pháp cụ thể) vs AST (cây cú pháp trừu tượng)?
CMCDragonkai

Các hành động / quy tắc ngữ nghĩa được nhúng trong tệp cú pháp của trình phân tích cú pháp hoặc trình phân tích cú pháp là cách thông thường để phân tích ngữ nghĩa và tạo AST, trong khi cây phân tích cú pháp hiếm khi được mã người dùng xây dựng hoặc sử dụng, ngoại trừ có lẽ để xác minh tính đúng đắn của trình phân tích cú pháp.


16

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.


11

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


4

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ữ.


1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.