Tengo una gramática que, hasta ahora, ha estado utilizando el patrón boost::spirit::ascii::space
/boost::spirit::ascii::space_type
skipper.Boost Spirit Qi Restablecer omisión con skip gramática personalizada
que tienen algunas reglas que utilizan el capitán y algunos que no lo hacen, como
qi::rule<Iterator, PTR<Expression>(), ascii::space_type> expression;
qi::rule<Iterator, PTR<Term>()> term;
Cuando utilizo un no saltarse no terminal (como term
) en el interior de un saltarse no terminal (como expression
), todo funciona como esperaba: el espacio en blanco solo importa dentro del term
no terminal.
Además, hasta ahora, he estado bien incluyendo no terminales que utilizan el patrón dentro de no terminales que no utilizan qi::skip
a reestablecer saltar, como
index = (qi::lit('[') >> qi::skip(ascii::space)[explist >> qi::lit(']')]);
De esta manera, los espacios en blanco no es significativa en el interior de los apoyos []
, pero está afuera.
Sin embargo, ahora quiero agregar mi propio patrón personalizado (quiero hacer nuevas líneas significativas y más tarde añadir comentario-omitir). Mi gramática patrón se parece a:
struct skip_grammar : qi::grammar<Iterator> {
qi::rule<Iterator> start;
skip_grammar() : skip_grammar::base_type(start) {
start = qi::char_("\t\r ");
}
};
he podido agregar en mis definiciones de reglas bien como
qi::rule<Iterator, PTR<Expression>(), skip_grammar> expression;
Pero me parece que no puede encontrar la manera de usar mi gramática salto como un argumento a qi::skip
(y reemplace ascii::space
). Intenté usar el tipo, una variable de instancia local y una variable de instancia global. Lo más lejos que he conseguido es hacer clang para quejarse de que mi skip_grammar necesita un constructor de copias. Así que traté de agregar un constructor de copia a mi gramática omitida, pero aparentemente la clase base boost::noncopyable
está ahí por una razón, porque mi binario segfaulted casi de inmediato.
¿Cómo debo usar esto?
Gracias
Bien fantástico. Gracias de nuevo por toda su increíble ayuda. Como un aparte, ¿debería usar reglas en lugar de gramáticas para omitir?No pensé que phrase_parse tomara el tipo de regla para el patrón. – jtolds
Cualquier componente analizador se puede utilizar como patrón para phrase_parse - sin limitaciones. – hkaiser
+1, el alias() era lo que estaba buscando, no estaba seguro de cómo usarlo para una gramática, pero aplicarlo a la regla de inicio en skip() tiene sentido. El diagnóstico MSVC es inútil aquí; solo se refiere a C2248 sin rastreo de origen. – namezero