2009-05-09 12 views
7

Necesito dividir un archivo de JavaScript en instrucciones individuales. Por ejemploParse JavaScript to instrument code

a = 2; 
foo() 
function bar() { 
    b = 5; 
    print("spam"); 
} 

tiene que separarse en tres instrucciones. (asignación, función llamada y definición de función).

Básicamente necesito instrumentar el código, insertando código entre estas instrucciones para realizar comprobaciones. Dividir por ";" Obviamente no funcionaría porque también puede finalizar las instrucciones con líneas nuevas y tal vez no quiera instrumentar el código dentro de las definiciones de funciones y clases (todavía no lo sé). Tomé un curso sobre gramáticas con flex/Bison pero en este caso la acción semántica para esta regla sería "imprimir todos los descendientes en el árbol de análisis sintáctico y poner mi código al final", lo que no se puede hacer con Bison básico, creo . ¿Cómo hago esto? También necesito dividir el código porque necesito interactuar con Python con python-spidermonkey. O ... ¿hay una biblioteca por ahí que me salva de reinventar la rueda? No tiene que ser en Python.

+0

Bueno, probaría jQuery AOP – mozillanerd

+0

No veo esta sugerencia de seguimiento. He instrumentado grandes bibliotecas de JavaScript. Espero que lo pruebes; Es fácil de usar. – mozillanerd

Respuesta

4

¿Por qué no utilizar un analizador de JavaScript? Hay muchos, incluyendo una API de Python para ANTLR y un contenedor de Python alrededor de SpiderMonkey.

+0

Miré en ANTLR pero parecía realmente complicado :-( Ya estoy planeando usar python-spidermonkey, pero primero necesito dividir el código correctamente: execute ("function foo() {") da un error. I simplemente pensé que habría otra manera ... si introduzco objetos de Python en el contexto js, ​​podría colocar las devoluciones de llamada en código de Python allí, pero parece bastante complicado, soy bastante nuevo en este lenguaje-interfaz (y yo ' También soy nuevo en js) – BruceBerry

+0

Las herramientas como ANTLR son "realmente complicadas" porque se enfrentan a problemas realmente complicados. Muchas personas intentan algún tipo de hack de cuerdas para manipular código, casi siempre termina mal, porque el hacking de cadenas no puede maneje las complicaciones de manera confiable. –

0

¿Por qué no utilizar un intérprete de JavaScript existente como Rhino (Java) o python-spidermonkey (no estoy seguro de si este todavía está vivo)? Analizará el JS y luego podrá examinar el árbol de análisis resultante. No estoy seguro de lo fácil que será volver a crear el código original, pero eso depende principalmente de qué tan legible debe ser el código instrumentado. Si nadie lo mira, solo genere una forma realmente compacta.

pyjamas también podría ser de su interés; este es un transpiler de Python a JavaScript.

[EDITAR] Si bien esto no resuelve su problema a primera vista, puede usarlo para un enfoque diferente: en lugar de instrumentar JavaScript, escriba su código en Python (que puede ser fácilmente instrumentado; todas las herramientas son ya está allí) y luego convertir el resultado a JavaScript.

Por último, si quiere resolver su problema en Python pero no puede encontrar un analizador: use un motor Java para agregar comentarios al código que luego puede buscar en Python para instrumentar el código.

+0

usted es el segundo en decir que puedo analizar el código con python-spidermonkey ... ¿lo entendí mal? No parece tener ninguna función de análisis nalidades. El código tiene que ser analizado en algún lugar, obviamente, pero se realiza en el interior del motor de spidermonkey, la interfaz de Python no proporciona ganchos en él. Solo veo "execute", "add_global", "rem_global" y "gc" expuestos para los programadores de python. ¿Me estoy perdiendo de algo? – BruceBerry

+0

Ver mi edición para explicar mi idea de tren. –

+0

desafortunadamente es parte de un proyecto para analizar la redirección en las páginas. No llego a escribir el código javascript :-) Y los sitios web maliciosos hacen todo lo posible para ocultar su código. – BruceBerry

2

JavaScript es difícil de analizar; necesitas un analizador de JavaScript completo. El DMS Software Reengineering Toolkit puede analizar el JavaScript completo y compilar el correspondiente AST. Los operadores de AST se pueden usar para caminar sobre el árbol y "dividirlo". Aún más fácil, sin embargo, es aplicar transformaciones de fuente a fuente que busquen un patrón de sintaxis superficial (JavaScript) y reemplazarlo por otro. Puede usar tales transformaciones para insertar la instrumentación en el código, en lugar de dividir el código para hacer las suspensiones en las que realizar las inserciones. Una vez completadas las transformaciones, DMS puede regenerar el código JavaScript válido (con los comentarios originales, si no se ve afectado).