Ví dụ đơn giản nhất để giải thích sự khác biệt giữa Cây Parse và Cây Cú pháp Trừu tượng là gì?


14

Theo hiểu biết của tôi, một trình phân tích cú pháp tạo ra một cây phân tích cú pháp, và sau đó loại bỏ nó sau đó. Tuy nhiên, nó cũng có thể bật ra một cây cú pháp trừu tượng mà trình biên dịch được cho là sử dụng.

Tôi có ấn tượng rằng cả cây phân tích cú pháp và cây cú pháp trừu tượng đều được tạo trong giai đoạn phân tích cú pháp. Sau đó, ai đó có thể giải thích tại sao những điều này là khác nhau?


3
Tại sao họ phải khác biệt? Họ có thể là điều tương tự từ hai quan điểm hơi khác nhau?
S.Lott

1
Không chắc chắn tôi hiểu hai "quan điểm hơi khác nhau" này :-(
Combinator Logic

Đó là điểm. Chúng giống nhau, do đó nhầm lẫn. Bạn chỉ có các từ khác nhau tùy thuộc vào quan điểm của bạn: Phân tích cú pháp so với tạo mã (hoặc Thực thi, trong trường hợp thông dịch viên).
S.Lott

Không có sự khác biệt. Với một chút trí tưởng tượng, người ta có thể phát minh ra một biểu diễn cú pháp cho bất kỳ cây cú pháp trừu tượng nào có thể. Với sự thiếu trí tưởng tượng, các biểu thức S của Lisp sẽ là một cú pháp mặc định phù hợp với mọi thứ.
SK-logic

1
Tất cả các bạn nên đọc câu trả lời trước khi bình luận. Có một sự khác biệt, nhưng có chúng riêng biệt hoặc kết hợp là một vấn đề thực hiện.
Paul

Câu trả lời:


20

Cây phân tích cú pháp còn được gọi là cây cú pháp cụ thể.

Về cơ bản, cây trừu tượng có ít thông tin hơn cây bê tông. Cây bê tông chứa từng yếu tố trong ngôn ngữ, trong khi cây trừu tượng đã vứt bỏ những mảnh không thú vị.

Ví dụ: biểu thức: (2 + 5) * 8

Bê tông trông như thế này

  ( 2  + 5 )  * 8
  |  \ | / |  | |
  |   \|/  |  | |
   \___|__/   | |
       \______|/

Trong khi đó cây trừu tượng có:

2  5 
 \/   
  +  8
   \/
   *

Trong các trường hợp cụ thể, dấu ngoặc đơn và tất cả các phần của ngôn ngữ đã được tích hợp vào cây. Trong trường hợp trừu tượng, dấu ngoặc đơn không còn nữa, vì thông tin của chúng đã được tích hợp vào cấu trúc cây.


Bạn đã quên đề cập đến trình biên dịch nào cho ngôn ngữ này được thực hiện theo cách này. Bởi vì, bạn biết đấy, bạn không cần phải ... trình phân tích cú pháp cũng có thể loại bỏ dấu ngoặc đơn ngay lập tức.
Ingo

1
@Ingo, không có gì trong câu trả lời của tôi có bất cứ điều gì để nói khi trình biên dịch loại bỏ dấu ngoặc đơn. Nó hỏi sự khác biệt giữa cây phân tích cụ thể và cây phân tích trừu tượng.
Winston Ewert

Vì vậy, chắc chắn, bạn có thể đặt tên một nguồn cho yêu cầu của bạn? Hay đây chỉ là định nghĩa riêng tư của bạn?
Ingo



0

Điều đầu tiên bạn cần hiểu là không ai bắt bạn phải viết trình phân tích cú pháp hoặc trình biên dịch theo một cách nhất định. Cụ thể, không nhất thiết là kết quả của trình phân tích cú pháp phải là một cây. Nó có thể là bất kỳ cấu trúc dữ liệu phù hợp để đại diện cho đầu vào.

Ví dụ: ngôn ngữ sau:

prog:
      definition 
    | definition ';' prog
    ;

definition: .....

có thể được trình bày dưới dạng một danh sách các định nghĩa. (Nitopperers sẽ chỉ ra rằng một danh sách một cây thoái hóa, nhưng dù sao đi nữa.)

Thứ hai, không cần phải giữ cây phân tích cú pháp (hoặc bất kỳ cấu trúc dữ liệu nào mà trình phân tích cú pháp trả về). Ngược lại, trình biên dịch thường được xây dựng như một chuỗi các đường chuyền, biến đổi kết quả của đường chuyền trước đó. Do đó bố cục tổng thể của trình biên dịch có thể là như vậy:

parser :: String             -> Maybe [Definitions]      -- parser
pass1  :: [Definitions]      -> Maybe DesugaredProg      -- desugarer
pass2  :: DesugaredProg      -> Maybe TypedProg          -- type checker
pass3  :: TypedProg          -> Maybe AbstractTargetLang -- code generation
pass4  :: AbstractTargetLang -> Maybe String             -- pretty printer

compiler :: String           -> Maybe String    -- transform source code to target code
compiler source = do
   defs  <- parser source
   desug <- pass1 defs
   typed <- pass2 desug
   targt <- pass3 typed
   pass4 targt

Bottom Line: Nếu bạn nghe người ta nói về cây phân tích cú pháp , cây syntac trừu tượng , cây cú pháp bê tông vv, luôn luôn thay thế bởi cấu trúc dữ liệu phù hợp với mục đích trao , và bạn đang sử dụng tốt.


2
Làm thế nào đây là một câu trả lời cho câu hỏi?
Winston Ewert

@WinstonEwert Tôi cho rằng "cây phân tích cú pháp" và "cây cú pháp trừu tượng" là trừu tượng và không có nghĩa gì hơn là "cấu trúc dữ liệu phù hợp". Vì vậy, câu trả lời là câu hỏi về tính tổng quát của nó không có ý nghĩa gì, trừ khi bạn hỏi về sự khác biệt giữa kiểu trả về của trình phân tích cú pháp và kiểu trả về của một số thông qua khác trong trình biên dịch XY của ngôn ngữ L.
Ingo
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.