Tôi đã quan tâm đến trình biên dịch/thiết kế thông dịch/thực hiện miễn là tôi đã lập trình (chỉ 5 năm nay) và nó luôn có vẻ như "ma thuật" đằng sau hậu trường mà không ai thực sự nói về (tôi biết ít nhất 2 diễn đàn để phát triển hệ điều hành, nhưng tôi không biết bất kỳ cộng đồng nào để phát triển trình biên dịch/phiên dịch/ngôn ngữ). Dù sao, gần đây tôi đã quyết định bắt đầu làm việc một mình, với hy vọng mở rộng kiến thức của tôi về lập trình nói chung (và hey, nó khá thú vị :). Vì vậy, dựa trên số lượng giới hạn tài liệu đọc mà tôi có và Wikipedia, tôi đã phát triển khái niệm này về các thành phần cho trình biên dịch/phiên dịch:Cây cú pháp trừu tượng là gì?
Mã nguồn -> Phân tích Lexical -> Cú pháp trừu tượng Tree -> Phân tích cú pháp -> Phân tích ngữ nghĩa -> Tạo mã -> Mã thực thi.
(Tôi biết có nhiều mã thế hệ và mã thực thi, nhưng tôi đã không nhận rằng đến nay chưa :)
Và với kiến thức đó, tôi đã tạo ra một lexer rất cơ bản (trong Java) để tận đầu vào từ một tệp nguồn và xuất các mã thông báo vào một tệp khác. Một đầu vào mẫu/đầu ra sẽ trông như thế này:
Input:
int a := 2
if(a = 3) then
print "Yay!"
endif
Output (từ lexer):
INTEGER
A
ASSIGN
2
IF
L_PAR
A
COMP
3
R_PAR
THEN
PRINT
YAY!
ENDIF
Cá nhân, tôi nghĩ rằng nó sẽ thực sự dễ dàng để đi từ đó đến phân tích cú pháp/ngữ nghĩa, và thậm chí có thể tạo mã, dẫn tôi đến câu hỏi: Tại sao lại sử dụng AST, khi có vẻ như lexer của tôi đang làm tốt như một công việc? Tuy nhiên, 100% nguồn của tôi tôi sử dụng để nghiên cứu chủ đề này tất cả đều có vẻ kiên quyết rằng đây là một phần cần thiết của bất kỳ trình biên dịch/phiên dịch nào. Tôi có thiếu điểm AST thực sự là gì không (một cái cây cho thấy luồng logic của một chương trình)?
TL; DR: Hiện đang trong quá trình phát triển trình biên dịch, đã hoàn thành lexer, có vẻ như tôi sẽ tạo ra phân tích cú pháp/phân tích cú pháp dễ dàng hơn là làm AST. Vì vậy, tại sao sử dụng một? Tôi có thiếu điểm không?
Cảm ơn!
Có nhiều tài nguyên về trình biên dịch và ngôn ngữ. Bắt đầu với http://lambda-the-ultimate.org/ –