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.
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
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