Tại sao GCC chuyển từ Bison sang trình phân tích cú pháp gốc đệ quy cho C ++ và C?


10

Có một sự thay đổi ngôn ngữ đòi hỏi nó hoặc một số lý do thực tế tại sao Bison không còn phù hợp hoặc tối ưu?

Tôi thấy trên wikipedia họ đã chuyển đổi, tham khảo các ghi chú phát hành GCC 3.4GCC 4.1 .

Những ghi chú phát hành trạng thái:

Một trình phân tích cú pháp C ++ đệ quy viết tay đã thay thế trình phân tích cú pháp C ++ có nguồn gốc từ YACC từ các bản phát hành GCC trước đó. Trình phân tích cú pháp mới chứa cơ sở hạ tầng được cải thiện cần thiết để phân tích mã nguồn C ++ tốt hơn, xử lý các phần mở rộng và phân tách rõ ràng (nếu có thể) giữa phân tích ngữ nghĩa và phân tích ngữ nghĩa phù hợp. Trình phân tích cú pháp mới sửa nhiều lỗi đã được tìm thấy trong trình phân tích cú pháp cũ.

Và:

Trình phân tích cú pháp C và Objective-C dựa trên Bison cũ đã được thay thế bằng trình phân tích cú pháp đệ quy gốc viết tay nhanh hơn, nhanh hơn

Những gì tôi muốn biết là những vấn đề thực tế mà họ gặp phải và tại sao không thể / không thực tế để giải quyết bằng Bison


1
cuối cùng tất cả các trình phân tích cú pháp sẽ trở thành homebrewn sau khi sửa đổi đủ khi trình tạo trình phân tích cú pháp không thể xử lý các yêu cầu
ratchet freak

1
Chia sẻ nghiên cứu của bạn giúp mọi người . Hãy cho chúng tôi những gì bạn đã cố gắng và tại sao nó không đáp ứng nhu cầu của bạn. Điều này chứng tỏ rằng bạn đã dành thời gian để cố gắng tự giúp mình, nó giúp chúng tôi tránh nhắc lại các câu trả lời rõ ràng và hầu hết nó giúp bạn có được câu trả lời cụ thể và phù hợp hơn. Xem thêm Cách hỏi
gnat

1
@gnat Tôi đã mở rộng câu hỏi của mình
neelsg

1
C ++ là một ngôn ngữ cực kỳ phức tạp để phân tích so với hầu hết các ngôn ngữ lập trình khác. Cảm giác ruột của tôi là một trình phân tích cú pháp đa năng có lẽ không thể hỗ trợ một số tối ưu hóa nhất định mà trình phân tích cú pháp ủ tại nhà có thể sử dụng.

Câu trả lời:


16

GCC chuyển sang phân tích cú pháp viết tay vì thông báo lỗi có ý nghĩa hơn khi sử dụng các kỹ thuật gốc đệ quy, như tôi đã giải thích ở đây .

Ngoài ra, C ++ đang trở thành một ngôn ngữ phức tạp (cú pháp) như vậy để phân tích rằng việc sử dụng trình tạo trình phân tích cú pháp không đáng giá cho nó.

Cuối cùng, phần lớn công việc của một trình biên dịch thực sự không phân tích cú pháp, nó đang tối ưu hóa. Các đường chuyền tối ưu hóa trung gian GCC phức tạp hơn nhiều so với phân tích cú pháp.

(BTW bạn có thể tùy chỉnh GCC, ví dụ như bằng plugin hoặc sử dụng MELT , nhưng bạn thực sự không thể mở rộng cú pháp của ngôn ngữ mà nó chấp nhận - ngoại trừ bằng cách thêm thuộc tính và pragma).

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.