2011-01-24 39 views
6

Tôi đang viết một bộ phân tích từ vựng. Nó có một chuỗi tiếng Anh, và chuyển đổi nó thành một tập hợp các tọa độ vĩ độ/kinh độ. Nó hơi giống Google Earth.boost :: spirit :: qi và các biến ngoài dãy số

Dù sao, tôi đã viết các bảng biểu tượng và ngữ pháp của mình, và nó phân tích dữ liệu định dạng một cách hạnh phúc.

struct LatLongDegrees 
{ 
std::string dirLat_; 
double degLat_; 
std::string  dirLong_; 
double degLong_; 
} 

Ví dụ: { "Bắc", 23.59, "Đông", -30,82}

Đây là ngữ pháp của tôi:

basic =(latitude >> ' ' >> double_ >> ' ' >> longitude >> ' ' >> double_); 

đâu vĩ độ và kinh độ là bảng biểu tượng mà bản đồ từ hướng dẫn viết tắt của la bàn đến các chuỗi (ví dụ: "e" đến "Đông")

Vì vậy, cho câu hỏi của tôi:

Tôi muốn thêm các quy tắc sau vào ngữ pháp của tôi, nơi vĩ độ và kinh độ ký tự là ở các vị trí ngược lại:

reversed = (longitude >> ' ' >> double_ >> ' ' >> latitude >> double_) 

này phân tích, NHƯNG các giá trị degLat_ và degLong_ không đảo ngược cùng với các giá trị chuỗi. Chúng được phân tích cú pháp trực tiếp vào cấu trúc, không quan tâm đến các nhãn chuỗi.

Làm cách nào để tạo cấu trúc (hoặc tăng :: vector kết hợp) khi dữ liệu được phân tích cú pháp không phải là tuần tự?

Trả lời

6

Bạn có nhiều khả năng. Cách đơn giản nhất là để thích ứng struct của bạn thành một chuỗi Fusion theo thứ tự yêu cầu:

BOOST_FUSION_ADAPT_STRUCT(
    LatLongDegrees, 
    (std::string, dirLong_) 
    (double, degLong_) 
    (std::string, dirLat_) 
    (double, degLat_) 
); 

(vâng, thứ tự của sự thích nghi không nhất thiết phải phù hợp với thứ tự của các thành viên trong cấu trúc ban đầu, bạn có thể thậm chí bỏ qua thành viên hoặc sao chép chúng). Điều này hoạt động tốt nếu bạn có một thứ tự cụ thể mà bạn muốn phân tích thành viên của mình.

Nếu bạn cần các thứ tự khác nhau trong cùng một chương trình, bạn có thể muốn sử dụng cơ chế thích ứng tương tự, nhưng bổ sung cho phép đặt tên các cấu trúc thích nghi:

BOOST_FUSION_ADAPT_STRUCT_NAME(
    LatLongDegrees, reversed_LatLongDegrees, 
    (std::string, dirLong_) 
    (double, degLong_) 
    (std::string, dirLat_) 
    (double, degLat_) 
); 

nơi reversed_LatLongDegrees là kiểu dữ liệu được sử dụng như các thuộc tính trong Thần ngữ pháp của bạn:

rule <Iterator, reversed_LatLongDegrees()> reversed; 
reversed = longitude >> ' ' >> double_ >> ' ' >> latitude >> double_; 

LatLongDegrees data; 
parse(begin, end, reversed, data); 

này cho phép tạo ra nhiều sự thích nghi cho các cấu trúc giống nhau cùng một lúc.

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