Estoy tratando de escribir un analizador de lenguaje de shell en Boost.Spirit. Sin embargo, no estoy seguro acerca de algunos problemas básicos relacionados con la semántica de rule
s.Copia o semántica de referencia de boost :: spirit's rule <>?
En cuanto a la documentación, hay miembros r.alias()
y r.copy()
de rule
. IIUC, estos miembros deben devolver una referencia a la regla y una copia del contenido de la regla, respectivamente. Sin embargo, no se especifica claramente qué sucede cuando solo uso la regla en una definición de otra regla. De mis experimentos, encontré mutuamente reglas recursivas puede ser definido por:
rule<Iter> r1, r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
que sugiere las reglas se toman como referencia dentro de expresiones del analizador. El problema es, ¿qué hacer cuando la variable se sale del ámbito, por ejemplo:
rule<Iter> r1;
{
rule<Iter> r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
}
... // use r1
En la misma nota, sería asignar a una regla de una expresión de análisis que contiene un valor de lado derecho del trabajo regla de tipo (r.copy()
sería un rvalue de tipo rule
también, ¿no es así? p.ej.
rule<Iter> f() { return char_('a') << char_('b'); }
rule<Iter> r1 = ... << f();
Puede alguien me ilumine en la semántica detalladas de copias y referencias rule
's, y posiblemente corregir cualquier malentendido en este post?
Gracias por esta respuesta. Solo tengo una pregunta de seguimiento: ¿es posible de todos modos utilizar valores r (temporales) de expresiones de analizador de algún tipo en la expresión del analizador para permitir enunciados como 'r1 = r1 | string ("abc") 'o generar reglas en una función? – jpalecek
Mientras que la expresión 'r1 = r1 | string ("abc") 'es teóricamente posible, es una recursividad a la izquierda, que dará como resultado una recursión infinita ya que Spirit genera analizadores de descenso recursivos. Pero la expresión 'r1 = cadena (' abc ') | r1 'funcionará como se esperaba. Puede generar una regla en una función si se asegura de que no se refiera a ninguna otra regla, que salió del alcance. Además, en Spirit.Classic necesita devolver r.copy() de la función. – hkaiser
'r1 = cadena ("abc") | r1 'es también recursión a la izquierda :) Pero lo que quería hacer es hacer que r1 coincida con lo que r1 hizo coincidir antes y "abc". Por cierto, ¿cómo puedo generar una regla en una función? Esto no funciona para mí: http://pastebin.org/482764 – jpalecek