2011-11-17 5 views
6

Ho sviluppato un po 'di codice e sto affrontando un problema con il flag di errore dell'interprete Tcl su una macchina Linux.Rilevamento statico di errori negli script Tcl

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

Il codice di cui sopra non è langue errori per "elseif" condizione fino a quando non entrare in condizione elseif. C'è un modo per controllare questo tipo di errore di battitura fatto involontariamente.

Grazie in anticipo!

+1

Una buona evidenziazione della sintassi nel vostro editor potrebbe aiutare. – schlenk

+0

@schlenk come ...? – Thufir

risposta

2

Per elaborare la risposta di Donal, Tcl non trova errori in fase di compilazione perché nel caso generale non può essere eseguito, qualsiasi codice eseguito prima del if potrebbe aver ridefinito il comando if, quindi potrebbe essere valido, l'unico modo per determinare se questo è il caso è quello di eseguire il codice (cioè questo è il problema della terminazione)

considerano questo script:

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

chiaramente che è impossibile determinare in modo statico se il caso {1} linea è il giusto numero di argomenti senza eseguire il programma

TCL non ha praticamente alcuna sintassi, non c'è nulla che un compilatore possa controllare, il meglio che puoi fare è un avviso di stile Lint, che sarà solo accurato in alcuni casi

5

Tcl non trova errori in fase di compilazione e nell'esempio sopra può determinare che non avrà mai bisogno di esaminare le clausole elseif in primo luogo; semplicemente emette direttamente il primo numero puts.

Ora, nel caso in cui ci sia una prima condizione non banale, è il caso che gli errori nell'espressione elseif non vengano segnalati fino a quando non vengono raggiunti. Questo è il modo in cui la semantica di Tcl - e in particolare il comando if - sono definiti; errori di valutazione (rispetto alla maggiore sintassi grossolana) sono riportati al momento dell'esecuzione del comando. Riesco a capire la tua frustrazione e suggerisco di dare un'occhiata allo Tcler's Wiki page sugli strumenti di analisi della sintassi statica, che possono segnalare potenziali problemi per te (sotto ipotesi molto modeste che sono praticamente sempre vere). In particolare, ho sentito cose positive su Frink e the checker tool in TDK (quest'ultimo è uno strumento commerciale, ma di altissima qualità).

+3

[Nagelfar] (http://nagelfar.berlios.de/) è un'altra opzione per un correttore di sintassi Tcl statico. – schlenk

+0

@schlenk: +1; Avrei dovuto ricordarmi di elencare anche quello. –

0

Tcl non trova errori in fase di compilazione, ma noi può controllare la sintassi usando regexp. Abbina lo schema "elseif {", Se presente verifica se ci sono caratteri all'interno della parentesi graffa "}". Se nulla è presente, stampare un messaggio di errore.

0

Ci sono controlli di sintassi statici tcl che possono trovare tali problemi.

Ecco l'elenco di tali controllate dopo: http://wiki.tcl.tk/3162

Il ttclchecker http://www.xdobry.de/ttclcheck produce seguente messaggio di errore per questo breve script

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