2011-11-17 2 views
6

일부 코드를 개발했으며 Linux 컴퓨터에서 Tcl 인터프리터의 오류 플래그에 문제가 있습니다. 그것은 elseif 상태로 될 때까지Tcl 스크립트의 오류 정적 검출

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

위의 코드는 "elseif" 조건 오류를 신고하지 않습니다. 실수로 이런 종류의 오타를 확인하는 방법이 있습니까?

감사합니다.

+1

도움이 될 편집기에서 강조 좋은 구문 오류 메시지가 다음과 같은 생산 ttclchecker. – schlenk

+0

@schlenk 같은 ...? – Thufir

답변

2

Donal 's 답변에 대해 자세히 설명하기 위해 일반적인 경우에는 수행 할 수 없기 때문에 Tcl은 컴파일시 오류를 찾지 않습니다. if 전에 실행 된 코드는 if 명령을 다시 정의했을 수 있으므로 유효 할 수 있습니다.

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

분명히이 (가) {1} 라인이있는 경우 경우 정적으로 결정하는 것은 불가능하다 :이 경우에 해당하는지 확인하는 것은

이 스크립트를 고려 (이것은 앞뒤가 맞지 않는 문제가 IE) 코드를 실행하는 것입니다 프로그램을 실행하지 않고 올바른 수의 인수를

TCL에는 실제로 구문이 거의 없습니다. 컴파일러가 확인할 수있는 것이 없습니다. 린트 스타일의 경고는 어떤 경우에만 정확합니다.

5

컴파일시에 Tcl이 오류를 찾지 못하고 위의 샘플에서 처음에 elseif 절을 검사 할 필요가 없다고 판단 할 수 있습니다. 그것은 단지 먼저 puts을 발행합니다.

이제는 평범하지 않은 첫 번째 조건이있는 경우 elseif 표현식의 오류가보고 될 때까지 오류가보고되지 않는 경우가 있습니다. 이것은 Tcl의 의미론, 특히 if 명령이 정의되는 방식입니다. 명령 실행시 오류 평가 (전체 주요 구문과 반대)가보고됩니다. 이 문제에 대한 귀하의 불만을 이해하고 정적 구문 분석 도구에 대한 Tcler's Wiki page을 확인해보십시오.이 도구는 잠재적 인 문제를 일으킬 수 있습니다 (사실은 항상 사실임을 겸손한 가정하에). 특히, 나는 Frinkthe checker tool in TDK에 대해 좋은 것을 들었다. (후자는 상업적 도구지만, 매우 높은 품질이다.)

+3

정적 인 Tcl 구문 검사기의 또 다른 옵션은 [Nagelfar] (http://nagelfar.berlios.de/)입니다. – schlenk

+0

@schlenk : +1; 나는 그걸 기억해야 했어. –

0

Tcl은 컴파일 할 때 오류를 찾지 않지만 우리는 regexp을 사용하여 구문을 확인할 수 있습니다. 패턴 "elseif {", 일치하는 경우 "}"중괄호 안에 문자가 있는지 확인하십시오. 아무것도 표시되지 않으면 오류 메시지를 인쇄하십시오.