2011-11-17 20 views
6

He desarrollado algún código, y estoy enfrentando un problema con el marcado de error del intérprete Tcl en una máquina Linux.Detección estática de errores en las secuencias de comandos Tcl

#!/usr/bin/tclsh 
if {1} { 
    puts "abc1" 
} elseif {} { 
    puts "abc2" 
} 

El código anterior no es error al marcar para "elseif" condición hasta que entrar en la condición elseif. ¿Hay alguna manera de verificar este tipo de error de escritura hecho involuntariamente?

¡Gracias de antemano!

+1

Un buen resaltado de sintaxis en el editor podría ayudar. – schlenk

+0

@schlenk como ...? – Thufir

Respuesta

2

Para elaborar la respuesta de Donal, Tcl no encuentra errores en tiempo de compilación porque en el caso general no se puede hacer, cualquier código ejecutado antes del if podría haber redefinido el comando if, por lo que podría ser válido, el único para determinar si este es el caso, es para ejecutar el código (es decir, este es el problema de la parada)

consideran este script:

gets stdin input 
if {$input == "fail"} { 
    rename if if_ 
    proc if {arg1 arg2 arg3} { 
    puts "ha ha" 
    } 
} 
if {1} { puts "success"} 

está claro que es imposible determinar de forma estática si el caso {1} line ha la cantidad correcta de argumentos sin ejecutar el programa

TCL realmente no tiene prácticamente ninguna sintaxis, no hay nada que un compilador puede comprobar, lo mejor que puede hacer es advertencias estilo pelusa, que sólo será precisa en algunos casos

5

Tcl no encuentra errores en el tiempo de compilación, y en el ejemplo anterior puede determinar que nunca será necesario examinar las cláusulas elseif en primer lugar; simplemente emite ese primer puts directamente.

Ahora, en el caso donde hay una primera condición no trivial es el caso que los errores en la expresión elseif no se informan hasta que se alcanzan. Así es como se define la semántica de Tcl, y especialmente el comando if; los errores en la evaluación (a diferencia de la sintaxis mayor bruta) se informan en el momento de la ejecución del comando. Puedo entender su frustración con esto, y sugerir que consulte Tcler's Wiki page en herramientas de análisis de sintaxis estática, lo que puede alertar sobre posibles problemas para usted (bajo suposiciones muy modestas que son prácticamente siempre ciertas). En particular, he escuchado cosas buenas sobre Frink y the checker tool in TDK (esta última es una herramienta comercial, pero de muy alta calidad).

+3

[Nagelfar] (http://nagelfar.berlios.de/) es otra opción para un verificador de sintaxis Tcl estático. – schlenk

+0

@schlenk: +1; Debería haber recordado enumerar eso también. –

0

Tcl no encuentra errores en tiempo de compilación, pero nos puede verificar la sintaxis usando regexp. Coincida con el patrón "elseif {", si está presente, verifique si hay algún carácter dentro del corchete "}". Si no hay nada presente, imprima un mensaje de error.

0

Hay tcl inspector de sintaxis estática que puede encontrar tales problemas.

Aquí está la lista de tales checkes: http://wiki.tcl.tk/3162

El ttclchecker http://www.xdobry.de/ttclcheck produce mensaje de error para este script cortos

stackoverflow.tcl:4: error in expression missing operator <<{}>> 
Cuestiones relacionadas