2011-01-24 9 views
6

Estoy escribiendo un analizador lexigráfico. Toma una cadena en inglés y la convierte en un conjunto de coordenadas de latitud/longitud. Es un poco como Google Earth.boost :: spirit :: qi y variables fuera de secuencia

De todos modos, he escrito mis tablas de símbolos y gramática, y estoy analizando datos formateados.

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

Por ejemplo: { "Norte", 23.59, "Medio", -30,82}

Aquí es mi gramática:

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

Dónde latitud y longitud son tablas de símbolos que se asignan a partir direcciones de la brújula de la taquigrafía en cadenas (por ejemplo, "e" a "Medio")

por lo tanto, a mi pregunta:

Quiero añadir la siguiente regla para mi gramática, donde la latitud y longitud símbolos están en las posiciones opuestas:

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

Este análisis sintáctico, pero los valores degLat_ y degLong_ no se revierten, junto con los valores de cadena. Simplemente se analizan directamente en la estructura, sin tener en cuenta las etiquetas de cadena.

¿Cómo construyo una estructura (o impulso :: vector de fusión) cuando los datos a analizar no son secuenciales?

Respuesta

6

Tiene varias posibilidades. Lo más fácil es que adaptar su estructura en una secuencia de fusión en el orden requerido:

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

(sí, el fin de la adaptación no tiene que coincidir con el orden de los miembros de la estructura original, incluso se puede dejar de lado miembros o duplicarlos). Esto funciona bien si tiene un orden particular en el que desea analizar a sus miembros.

Si necesita realizar diferentes pedidos en el mismo programa, es posible que desee utilizar un mecanismo de adaptación similar, pero que además le permita dar un nombre la struct adaptado:

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

donde reversed_LatLongDegrees es el tipo de datos se utiliza como el atributo en su gramática Espíritu:

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

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

Esto permite crear varias adaptaciones para el mismo struct al mismo tiempo.

Cuestiones relacionadas