2011-03-09 9 views
5

Básicamente estoy haciendo un analizador de expresiones. Como necesito el mejor rendimiento posible y, de acuerdo con la documentación, la construcción de una gramática puede ser bastante lenta, me gustaría reutilizar la gramática y vincular la tabla de símbolos justo antes de analizar. Como es probable que el cliente de la gramática tenga una tabla de símbolos construida y mantenida antes del análisis, me gustaría evitar copiar también la tabla real, lo que me lleva al siguiente código (simplificado) para traducir términos:Usando un puntero a un analizador en boost :: spirit

qi::symbols< char, double >* m_Symbols; 
qi::rule< Iterator, double(), ascii::space_type > m_Val; 

m_Val = qi::int_[ _val = boost::phoenix::static_cast_<double>(boost::spirit::_1) ] | qi::double_ | m_Symbols; 

El problema aquí es m_Symbols. Lo que me gustaría es que m_Val mantenga m_Symbols por referencia, ya que cuando estamos vinculando la tabla de símbolos, naturalmente estoy modificando el puntero, que supongo que de alguna manera puede ser resuelto mediante el uso de boost :: phoenix :: ref? Pero el problema más grande es que parece que no puedo usar el puntero a los analizadores al componer un nuevo analizador. Al usar la desreferencia en la expresión dereferences m_Symbols de forma inmediata, que no es deseada, quiero retrasar la eliminación de referencias para analizar el tiempo.

+0

Esto realmente parece ser un enfoque equivocado para reducir el número de instancias de gramática. ¿Por qué no solo tener una instancia estática/única de la gramática y hacer que no se pueda copiar? – ildjarn

+0

Tristemente, aún tendría que vincular la tabla de símbolos antes del análisis, lo que daría lugar al mismo problema. – Ylisar

Respuesta

2

creo que un simple

qi::symbols<char, double>* m_Symbols; 
qi::rule<Iterator, double(), ascii::space_type> m_Val; 

m_Val = qi::int_ | qi::double_ | qi::lazy(*m_Symbols); 

debe hacer lo que necesita. El analizador lazy (ver here) evalúa su argumento (repetidamente) solo en tiempo de análisis.

+0

Gracias por la ayuda, increíble con un experto para ayudar! Lamentablemente, ya probé esa solución y parece que qi :: lazy() no está muy feliz de aceptar esa expresión. Recibo el siguiente error de MSVC 2008: 1> /main.cpp(75): error C2784: 'proto :: terminal > :: type boost :: spirit :: lazy (const boost :: phoenix :: actor &) ': no ​​se puede deducir el argumento de la plantilla para' const boost :: phoenix :: actor & 'from' boost :: spirit :: qi :: symbols ' Lo que nos lleva a creer m_Symbols se desreferencia antes de pasar a lazy()? – Ylisar

+2

Parecería que lo siguiente es el truco: qi :: lazy (* boost :: phoenix :: val (boost :: phoenix :: ref (m_Symbols))). Val actúa como un contenedor para defferir la desreferencia, ref para asegurarse de que el puntero no se copie. – Ylisar

Cuestiones relacionadas