Pregunta

Estoy tratando de utilizar copa de árbol para analizar un archivo de ERB. Tengo que ser capaz de manejar líneas como la siguiente:

<% ruby_code_here %>
<%= other_ruby_code %>

Desde copa de árbol está escrito en Ruby, y nos escribe copa de árbol gramáticas en Ruby, es ya de alguna manera existe en copa de árbol que decir "Hey, mira para el código Ruby aquí, y me dan su descomposición" sin tener que escribir por separado reglas para manejar todas las partes del lenguaje Ruby? Estoy buscando una manera, en mi archivo de gramática .treetop, tener algo como:

rule erb_tag
  "<%" ruby_code "%>" {
    def content
      ...
    end
  }
end

Donde ruby_code es manejado por algunas reglas que Treetop ofrece.

Editar demás analizada usando Rubí ERB -Lex, pero tengo errores tratando de reproducir lo que hizo. El programa rlex no produjo una clase llena cuando se genera la clase analizador.

Editar la derecha, por lo que muchos son deprimentes, pero gracias por la info. :) Para el proyecto de mi Maestro, estoy escribiendo un generador de caso de prueba que necesita trabajar con ERB como entrada. Afortunadamente, para mis propósitos, sólo tengo que reconocer algunas cosas en el código ERB, tales como estados de if y otros condicionales, así como los bucles. Creo que puedo llegar a la gramática copa de árbol para que coincida, con la advertencia de que no se haya completado para Ruby.

¿Fue útil?

Solución

Por lo que yo sé, nadie ha creado todavía una gramática copa de árbol para Ruby. (De hecho, nadie ha sido capaz de crear cualquier gramática para Ruby que no sea la gramática YACC que se incluye con la resonancia magnética y YARV.) Sé que el autor de la copa de árbol ha estado trabajando en uno durante varios años , pero no es una tarea trivial. Conseguir la gramática antlr que se utiliza en XRuby derecha tomó cerca de 5 años, y todavía no es totalmente compatible.

La sintaxis de Ruby es locamente , mindbogglingly compleja.

Otros consejos

n


Yo no lo creo. Especificación del complejo y sutil gramática rubí en la copa de árbol sería un logro importante, pero debería ser posible.

La gramática rubí real está escrito en yacc. Ahora, yacc es una herramienta legendaria, pero los árboles genera una clase más poderosa de programas de análisis, por lo que debe ser posible y tal vez alguien lo ha hecho.

No es un proyecto de la tarde.

Puede ser que soy es broma pero si yacc es menos complejo que el rubí entonces usted podría realizar yacc en la que los árboles que utiliza la gramática rubí creado por yacc.

Para sus propósitos, es probable que pueda salir de allí sin analizar todos Ruby. Lo que realmente se necesita es una manera de detectar el%> que cierra un bloque de Ruby. Si no quiero volver a fallar cuando el código Ruby contiene los caracteres de cierre, debe detectar cualquier lugar esos personajes pueden ocurrir dentro del texto Rubí; Lo que significa que necesita para detectar todas las formas de literales.

Sin embargo, para los propósitos usted puede conseguir probablemente lejos con el reconocimiento de los casos más probables donde%> podría ocurrir en el texto Ruby, y hacer caso omiso a solo esos casos. Esto supone, por supuesto, que cualquier fallo restante puede ser manejado por conseguir su usuario escriba el ERB un poco diferente.

Por lo que vale, Cima del árbol en sí "análisis sintácticos" Ruby bloques de esta manera; Simplemente conteos {y} hasta que el cierre se encontraron. Así que si su bloque contiene un} en una cadena literal, que está roto (pero se puede evitar mediante la inclusión de un juego en un comentario).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top