son que las comentarios comentar javascript parsing abstract-syntax-tree

javascript - que - comentarios en php



Reemplazar comentario en JavaScript AST con subárbol derivado del contenido del comentario (2)

Soy el autor de doctest , doctests rápidos y sucios para JavaScript y CoffeeScript. Me gustaría que la biblioteca esté menos sucia utilizando un analizador de JavaScript en lugar de expresiones regulares para ubicar los comentarios.

Me gustaría usar Esprima o Acorn para hacer lo siguiente:

  1. Crear un AST
  2. Recorre el árbol, y para cada nodo de comentario:
    1. Crear un AST a partir del texto del nodo de comentario
    2. Reemplace el nodo de comentario en el árbol principal con este subárbol

Entrada:

!function() { // > toUsername("Jesper Nøhr") // "jespernhr" var toUsername = function(text) { return ('''' + text).replace(//W/g, '''').toLowerCase() } }()

Salida:

!function() { doctest.input(function() { return toUsername("Jesper Nøhr") }); doctest.output(4, function() { return "jespernhr" }); var toUsername = function(text) { return ('''' + text).replace(//W/g, '''').toLowerCase() } }()

No se como hacer esto. Acorn proporciona un andador que toma un tipo de nodo y una función, y recorre el árbol invocando la función cada vez que se encuentra un nodo del tipo especificado. Esto parece prometedor, pero no se aplica a los comentarios.

Con Esprima puedo usar esprima.parse(input, {comment: true, loc: true}).comments para obtener los comentarios, pero no estoy seguro de cómo actualizar el árbol.


Analizadores sintácticos que producen AST descartan los comentarios. No sé qué hacen Esprima o Acorn, pero ese podría ser el problema.

.... de hecho, Esprima lista la captura de comentarios como un error actual: http://code.google.com/p/esprima/issues/detail?id=197

... El código de Acorn está ahí en GitHub. Parece arrojar comentarios, también.

Entonces, parece que tienes que arreglar cualquiera de los analizadores para capturar los comentarios primero, en ese momento tu tarea debería ser sencilla o estás atascado.

Nuestro DMS Software Reengineering Toolkit tiene analizadores de JavaScript que capturan comentarios en el árbol. También tiene analizadores de subcadenas de lenguaje, que podrían usarse para analizar el texto de comentario en JavaScript AST de cualquier tipo que represente el comentario (por ejemplo, declaración de función, expresión, declaración de variable, ...), y la maquinaria de soporte para injertar tales AST nuevos en el árbol principal. Si va a manipular AST, esta capacidad de subcadena es probablemente importante: la mayoría de analizadores no analizarán fragmentos de lenguaje arbitrarios, sino que están cableados solo para analizar "programas completos". Para DMS, no hay nodos de comentarios para reemplazar; hay comentarios asociados con los nodos de AST, por lo que el proceso de injerto es un poco más complicado que simplemente "reemplazar los nodos de comentario". Todavía es bastante fácil.

Observaré que la mayoría de los analizadores sintácticos (incluidos estos) leen la fuente y la dividen en tokens utilizando o aplicando el equivalente de expresiones regulares. Por lo tanto, si ya los está usando para ubicar los comentarios (eso significa usarlos para ubicar los * non * comentarios que desechar, también, por ejemplo, necesita reconocer literales de cadena que contengan texto similar a un comentario e ignorarlos), usted está hacer tan bien como los analizadores lo harían de todos modos en términos de encontrar los comentarios. Y si lo único que quieres hacer es reemplazarlos exactamente con su contenido, repetir el flujo de la fuente con el prefijo / sufijo del comentario / * * / stripped hará exactamente lo que quieras, por lo que toda esta maquinaria de análisis parece exagerada.


Ya puede usar Esprima para lograr lo que quiere:

  1. Analice el código, obtenga los comentarios (como una matriz).
  2. Revise los comentarios, vea si cada uno es lo que le interesa.
  3. Si necesita transformar el comentario, tenga en cuenta su rango. Recoge todas las transformaciones.
  4. Aplique la transformación de vuelta a la primera para que los rangos no se cambien.

El truco es aquí no cambiar el AST. Simplemente aplique el cambio de texto como si estuviera haciendo una búsqueda típica de reemplazar en la cadena fuente directamente. Debido a que la posición del reemplazo puede cambiar, debe recopilar todo y luego hacerlo desde el último. Para ver un ejemplo de cómo llevar a cabo una transformación de este tipo, consulte la publicación de mi blog "De comillas dobles a comillas simples" (se trata de comillas pero el principio sigue siendo el mismo).

Por último, pero no menos importante, es posible que desee utilizar una utilidad de un nivel ligeramente superior, como Rocambole .