2009-05-14 43 views
10

Estoy usando una aplicación de código cerrado que carga scripts Lua y permite cierta personalización modificando estos scripts. Lamentablemente, esa aplicación no es muy buena para generar resultados de registro útiles (todo lo que obtengo es 'script failed') si algo falla en uno de los scripts de Lua.analizando estáticamente el código Lua para posibles errores

Me doy cuenta de que los lenguajes dinámicos son bastante resistentes al análisis de código estático en la forma en que se puede analizar el código de C++, por ejemplo.

Tenía la esperanza, sin embargo, de que hubiera una herramienta que se ejecutara a través de un script Lua y p. Ej. advierte sobre variables que no se han definido en el contexto de una secuencia de comandos en particular.

Esencialmente lo que estoy buscando es una herramienta que para un script:

local a 
print b 

sería de salida:

warning: script.lua(1): local 'a' is not used' 
warning: script.lua(2): 'b' may not be defined' 

Es realmente sólo puede ser advertencias para la mayoría de las cosas, sino que todavía habría ¡útil! ¿Existe tal herramienta? ¿O tal vez un Lua IDE con una característica como esa incorporada?

Gracias, Chris

Respuesta

9

El análisis del código estático automatizado para Lua no es una tarea fácil en general. Sin embargo, para un conjunto limitado de problemas prácticos es bastante factible.

Quick googling for "lua lint" produce estas dos herramientas: lua-checker y Lua lint.

Sin embargo, es posible que desee utilizar su propia herramienta para sus necesidades específicas.

Metalua es una de las herramientas más potentes para el análisis estático de códigos Lua. Por ejemplo, consulte metalint, la herramienta para el análisis global de uso de variables.

Por favor, no dude en publicar su pregunta en Metalua mailing list. La gente de allí suele ser muy útil.

1

que necesita para encontrar un programa de análisis para LUA (debe estar disponible como código abierto) y utilizarlo para analizar la secuencia de comandos en un árbol AST adecuada. Use ese árbol y un rastreador de visibilidad variable simple para averiguar cuándo una variable está o no definida.

Por lo general, las reglas de alcance son simples:

  • inicio con el nodo AST superior y un alcance vacío
  • mirada tema en las declaraciones del niño para ese nodo. Cada declaración de variable debe agregarse en el alcance actual.
  • si se está iniciando un nuevo ámbito (por ejemplo, a través de un {operador) crear un nuevo ámbito de variables heredando las variables en el ámbito actual).
  • cuando finaliza un ámbito (por ejemplo, mediante}) elimina el ámbito variable hijo actual y vuelve al padre.
  • Itera cuidadosamente.

Esto le proporcionará las variables visibles dentro del AST. Puede utilizar esta información y si también inspecciona las expresiones nodos AST (lectura/escritura de variables) puede encontrar su información.

+0

Probablemente no quiso decir "{" y "}" (que sirven como constructor de tabla en Lua), sino palabras clave "do" y "end" (también varias construcciones de control como if-then-else, dos tipos de bucles for etc.). –

+0

No tengo idea de cómo se ve el lenguaje lua :-) Pero supongo que tiene alguna idea de "alcance variable". De hecho hice este tipo de cosas recientemente para Java. –

2

Para comprobar globales, vea this lua-l posting. Controlar a los locales es más difícil.

+0

Para Lua 5.2, ver http://lua-users.org/lists/lua-l/2012-12/msg00397.html. – lhf

Cuestiones relacionadas