2011-01-24 24 views
6

Bir sözcük analizcisi yazıyorum. İngilizce bir dizge alır ve onu bir enlem/boylam koordinat kümesine dönüştürür. Google Earth’e benziyor.boost :: spirit :: qi ve dizi dışı değişkenler

Her neyse, sembol tablolarımı ve dilbilgisi yazdım ve biçimlendirilmiş verileri mutlu bir şekilde böler.

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

Örneğin: { "Kuzey", 23.59, "Doğu", -30,82} Burada

benim dilbilgisi geçerli: enlem ve boylam gelen haritasına sembol tabloları vardır

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

dizeleri steno pusula yönleri (örneğin, "e" ile "Doğu")

Yani, soruma tarih:

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

Bu ayrıştırır ANCAK degLat_ ve degLong_ değerleri dize değerlerini birlikte geri çevrilmez: 10 Ben enlem ve boylam sembolleri karşı pozisyonlarda olan benim gramer, aşağıdaki kural eklemek istiyorum. Bunlar dize etiketleri dikkate alınmadan doğrudan yapıya ayrıştırılır.

Ayrıştırılacak veriler sıralı olmadığında nasıl bir struct (veya boost :: fusion vector) oluştururum?

cevap

6

Çeşitli olasılıklarınız var.

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

(evet, adaptasyon sırası orijinal yapı içinde üyelerin sıra ile aynı olması değil, hatta dışarı bırakabilir: En kolay gerekli sırayla Fusion dizisi içine yapı adapte etmektir üye veya çoğaltın).

Üyelerinizi ayrıştırmak istediğiniz belirli bir siparişiniz varsa bu, iyi çalışır. Aynı programda farklı siparişlere ihtiyacınız varsa, benzer bir uyarlama mekanizmasını kullanmak isteyebilirsiniz, ancak buna ek olarak bir isim verebilirsiniz. uyarlanmış yapı:

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

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

Bu aynı zamanda aynı yapı için çeşitli uyarlamalar oluşturmanıza olanak sağlar: reversed_LatLongDegrees senin Ruh dilbilgisinde niteliği olarak kullanılan veri türüdür

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

.

İlgili konular