Giống như nhiều câu hỏi khác, tôi đang cố gắng phân tích một ngữ pháp đơn giản thành một cây cấu trúc bằng cách sử dụng Boost.Spirit.Qi.Boost.Spirit.Qi: Lấy thuộc tính của quy tắc và đặt nó làm trường thuộc tính struct của quy tắc kèm theo?
Tôi sẽ cố gắng chưng cất những gì tôi đang cố gắng làm cho trường hợp đơn giản nhất có thể. Tôi có:
struct Integer {
int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))
Sau đó, bên trong một cấu trúc ngữ pháp, tôi có biến thành viên sau đây:
qi::rule<Iterator, Integer> integer;
mà tôi đang xác định với
integer = qi::int_;
Khi tôi cố gắng thực sự phân tích một số nguyên, tuy nhiên, sử dụng
qi::phrase_parse(iter, end, g, space, myInteger);
myInteger.value
luôn được uninitialized sau khi phân tích thành công. Tương tự như vậy, tôi đã cố gắng định nghĩa sau đây (rõ ràng là những người mà không biên dịch là sai):
integer = qi::int_[qi::_val = qi::_1]; //compiles, uninitialized value
integer = qi::int_[qi::_r1 = qi::_1]; //doesn't compile
integer = qi::int_[phoenix::bind(&Integer::value, qi::_val) = qi::_1]; //doesn't
integer = qi::int_[phoenix::at_c<0>(qi::_val) = qi::_1]; //doesn't
Rõ ràng tôi đang hiểu lầm gì đó về Thánh Linh, Phoenix, hay cái gì khác. Sự hiểu biết của tôi là qi::_1
là thuộc tính đầu tiên của qi::int_
, tại đây và phải đại diện cho số nguyên được phân tích cú pháp, khi phần trong dấu ngoặc vuông được thực hiện dưới dạng đối tượng hàm. Sau đó tôi giả định rằng đối tượng hàm sẽ lấy thuộc tính integer
kèm theo qi::_val
và thử và gán số nguyên được phân tách cho nó. Tôi đoán là vì cuộc gọi BOOST_FUSION_ADAPT_STRUCT
của tôi, cả hai sẽ tương thích và chắc chắn có vẻ như là trường hợp từ góc độ phân tích tĩnh, nhưng dữ liệu không được bảo toàn.
Có một tham chiếu (&) chỉ định Tôi đang thiếu một nơi nào đó hoặc một cái gì đó?
tôi chỉ tìm thấy một sự kết hợp đó biên dịch, mặc dù nó không dẫn đến dữ liệu khởi tạo: Tôi đã thêm một constructor cho 'Integer' mà phải mất một giá trị cho một' giá trị' , sau đó xác định phân tích cú pháp 'nguyên' của tôi là' integer = qi :: long_long [qi :: _ val = phx :: xây dựng (qi :: _ 1)]; ' –
jtolds
oops, ý tôi là' qi :: int_' – jtolds
ghi chú. trong mã đầy đủ của tôi, tôi thực sự có 'qi :: rule integer;', có vẻ như nó bị hỏng nếu tôi thay thế 'Integer' bằng' Integer() ', và tất cả các ví dụ có dấu gạch chéo '()', mà tôi đã bỏ qua. Vì vậy, có lẽ các đối số mẫu cho 'quy tắc' đã bị vặn lên. Đào. –
jtolds