7

Tôi đang cố gắng học cách xây dựng một trình biên dịch đơn giản như một sở thích. Tôi đang nhắm mục tiêu máy ảo Java.Chuyển đổi cây cú pháp trừu tượng sang mã byte

Tôi đã viết một ngữ pháp đơn giản bằng cách sử dụng plugin ANTLR cho Eclipse.

Có người nói với tôi rằng có một cái gì đó được gọi là nút phương thức trên AST được tạo bởi Antlr và điều đó phải được gọi. Tôi đang lên kế hoạch sử dụng ASM để tạo mã byte. Vậy nút phương thức là gì và tôi gọi nó như thế nào từ ASM và làm cho nó truy cập hướng dẫn phương pháp?

Còn về phân tích ngữ nghĩa của trình biên dịch. Có nên viết bằng tay hoặc có máy phát điện nào không?

Trả lời

3

Bạn đặt nhiều câu hỏi không liên quan ở đây. Tùy thuộc vào ngôn ngữ bạn xác định, có thể có nút phương pháp trong ngôn ngữ của bạn hoặc sẽ không có bất kỳ ngôn ngữ nào, nếu ngôn ngữ của bạn biên dịch theo phương pháp main(String[]) vô điều kiện.

Có nhiều cách tiếp cận để chuyển đổi AST sang ngôn ngữ đích. Chủ yếu là bạn sẽ không tạo mã trực tiếp, nhưng tạo ra một AST cho nền tảng mục tiêu của bạn và có một máy in khá tạo ra mã nguồn của nó, bằng cách sử dụng một cây treewalker.

Phân tích ngữ nghĩa lập trình trình biên dịch. Đọc và hiểu đầu vào ở cấp độ cú pháp là phân tích cú pháp. Bạn sẽ cần phải viết phân tích ngữ nghĩa của riêng bạn hoặc bạn sẽ không viết một trình biên dịch nào cả. ;-)

Tôi đoán bạn sử dụng Jasmin để biên dịch mã assembly? Một khởi đầu rất tốt là viết các ngữ pháp cho ngôn ngữ nhập liệu của bạn và ngôn ngữ đích (Jasmin) và suy nghĩ về, cấu trúc đầu vào nào sẽ hiển thị kết quả đầu ra nào. Làm thế nào để viết một vòng for i := 1 to 10 trong Jasmin? Giải quyết các vấn đề nhỏ và mở rộng trình biên dịch của bạn khi cần thiết, nhưng từ từ, thử nghiệm các phép biến đổi mới được triển khai sớm và kỹ lưỡng.

A rất đọc tốt: Let's Build a Compiler, by Jack Crenshaw.

+1

Cảm ơn rất nhiều, gần đây tôi đã nhận được câu trả lời tương tự của [stephen chin], hãy xây dựng trình biên dịch, bởi Jack Crenshaw có vẻ rất hay, tôi sẽ bắt đầu đọc nó. – Gautam

Các vấn đề liên quan