Tôi đang cố viết một trình phân tích ngôn ngữ trình bao trong Boost.Spirit. Tuy nhiên, tôi không rõ ràng về một số vấn đề cơ bản liên quan đến ngữ nghĩa của rule
s.Sao chép hoặc tham chiếu ngữ nghĩa của boost :: quy tắc của tinh thần <>?
Nhìn vào tài liệu, có các thành viên r.alias()
và r.copy()
trong số rule
. IIUC, các thành viên này nên trả về một tham chiếu đến quy tắc và một bản sao nội dung của quy tắc, tương ứng. Tuy nhiên, nó không được xác định rõ ràng những gì sẽ xảy ra khi tôi chỉ sử dụng quy tắc trong định nghĩa của một quy tắc khác. Từ các thử nghiệm của tôi, tôi đã tìm thấy các quy tắc đệ quy hai bên có thể được xác định bởi:
rule<Iter> r1, r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
cho biết các quy tắc được thực hiện bằng tham chiếu bên trong biểu thức phân tích cú pháp. Vấn đề là, nó làm gì khi biến đi ra khỏi phạm vi, ví dụ:
rule<Iter> r1;
{
rule<Iter> r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
}
... // use r1
Cùng lưu ý, sẽ gán cho một quy tắc từ một biểu thức phân tích có chứa một rvalue công việc loại quy tắc (r.copy()
sẽ một rvalue loại rule
quá, phải không?) ví dụ.
rule<Iter> f() { return char_('a') << char_('b'); }
rule<Iter> r1 = ... << f();
Ai có thể soi sáng cho tôi về ngữ nghĩa chi tiết của bản và tài liệu tham khảo rule
's, và có thể sửa bất kỳ quan niệm sai lầm trong bài viết này?
Cảm ơn câu trả lời này. Tôi chỉ có một câu hỏi tiếp theo: Có cách nào có thể sử dụng các giá trị (tạm thời) của các biểu thức phân tích cú pháp của một số loại trong biểu thức phân tích cú pháp để cho phép các câu lệnh như 'r1 = r1 | string ("abc") 'hoặc tạo các quy tắc trong một hàm? – jpalecek
Trong khi biểu thức 'r1 = r1 | chuỗi ("abc") 'về mặt lý thuyết có thể là một đệ quy trái, điều này sẽ dẫn đến một đệ quy vô hạn vì Spirit tạo ra các trình phân tích cú pháp gốc đệ quy. Nhưng biểu thức 'r1 = string ("abc") | r1 'sẽ hoạt động như mong đợi. Bạn có thể tạo một quy tắc trong một hàm nếu bạn đảm bảo rằng nó không tham chiếu đến bất kỳ quy tắc nào khác, mà đã vượt quá phạm vi. Ngoài ra, trong Spirit.Classic bạn cần trả về r.copy() từ hàm. – hkaiser
'r1 = chuỗi ("abc") | r1 'là trái đệ quy quá :) Nhưng những gì tôi muốn làm, là làm cho r1 phù hợp với những gì r1 phù hợp trước đó và "abc". BTW làm thế nào tôi có thể tạo ra một quy tắc trong một chức năng? Điều này không hiệu quả đối với tôi: http://pastebin.org/482764 – jpalecek