2011-12-15 41 views
5

Tôi đang sử dụng Bison để tạo trình phân tích cú pháp. Tôi đã có một sự thay đổi/giảm xung đột mà tôi thực sự cần Bison để sử dụng GLR thay vì LALR để đối phó với nó. Nhưng tôi đã thông qua chỉ thị %glr-parser và tệp nguồn vẫn cho biết rằng đó là một trình phân tích cú pháp LALR. Tôi thậm chí còn tìm thấy một bộ xương "glr.cc" cho thấy rằng nó là một trình phân tích cú pháp GLR C++ và sử dụng nó bằng %skeleton "glr.cc" không thay đổi đầu ra. Bison không gửi tất cả các thuật toán cho tất cả các ngôn ngữ đích của nó?Trình phân tích cú pháp C++ GLR với Bison

+0

bò rừng là phần mềm miễn phí, vì vậy bạn có thể nghiên cứu và cải thiện mã soruce của nó. Nhân tiện, bạn có cân nhắc sử dụng một trình tạo trình phân tích cú pháp khác, như ANTLR không? –

+1

@Basile: Ngữ pháp của tôi không phải là LL. Để cải thiện mã nguồn của nó, bạn có nghĩa là, nếu tôi muốn xe tải thông qua sáu tỷ tiện ích hỗ trợ là tốt. – Puppy

+0

ANTLR có một số hacks để đối phó với một số loại LL ngữ pháp không. –

Trả lời

1

Bạn chỉ cần %glr-parser để lấy trình phân tích cú pháp GLR. Lưu ý rằng các trình phân tích cú pháp GLR có thể STILL có xung đột (shift/reduce hoặc reduce/reduce), nó chỉ là trình phân tích cú pháp được tạo sẽ thử cả hai lựa chọn thay thế và thống nhất kết quả.

Nếu bạn muốn đóng thông điệp về xung đột, bạn có thể sử dụng %expect%expect-rr. Hoever, chỉ mù quáng khi sử dụng trình phân tích cú pháp GLR mà bạn không hiểu tất cả các xung đột là nguy hiểm - trình phân tích cú pháp kết quả có thể mất nhiều thời gian để phân tích cú pháp đầu vào nếu bạn không cẩn thận hoặc có thể cung cấp cho bạn các lỗi mơ hồ khi chạy.

+0

Điều này không thực sự trả lời câu hỏi - tôi đã nói rằng tôi đã cố gắng '% glr-parser' – Puppy

+0

@DeadMG: sau đó bạn có trình phân tích cú pháp GLR. Chỉ các trình phân tích cú pháp GLR của nó có cùng một sự dịch chuyển/giảm và giảm/giảm xung đột như các trình phân tích cú pháp LALR, chúng chỉ xử lý chúng theo một cách khác. –

+0

Tôi đã không nói rằng tôi không có một vì nó vẫn còn báo cáo xung đột, tôi nói tôi vẫn còn có một vì ý kiến ​​của tập tin nguồn vẫn tuyên bố như vậy. – Puppy

1

Tôi không biết ý bạn là gì bởi "%skeleton "glr.cc" không thay đổi đầu ra", bởi vì nó có! Bạn có chắc là bạn đã thực sự tái tạo đầu ra không? Nếu bạn đã làm, vui lòng cung cấp thêm chi tiết.

$ echo "%% exp: '0'" > /tmp/f.y 
$ bison -S lalr1.cc /tmp/f.y -o f1.cc 
$ bison -S glr.cc /tmp/f.y -o f2.cc 
$ ls -l f1.cc f2.cc 
-rw-r--r-- 1 akim wheel 28373 30 oct 09:29 f1.cc 
-rw-r--r-- 1 akim wheel 82767 30 oct 09:29 f2.cc 
Các vấn đề liên quan