Статическое обнаружение ошибок в Tcl-скриптах - PullRequest
6 голосов
/ 17 ноября 2011

Я разработал некоторый код, и у меня возникла проблема с пометкой ошибок интерпретатора Tcl на компьютере с Linux.

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

Приведенный выше код не помечает ошибку для условия "elseif" допопасть в состояние elseif.Можно ли как-то проверить, что такого рода опечатка сделана неумышленно.

Ответы [ 4 ]

6 голосов
/ 17 ноября 2011

Tcl не находит ошибок во время компиляции, и в приведенном выше примере он может определить, что ему никогда не потребуется проверять предложения elseif в первую очередь; он просто выдает первый puts напрямую.

Теперь, в случае если нетривиальное первое условие, это случай, когда ошибки в выражении elseif не сообщаются, пока не будут достигнуты. Вот как определяется семантика Tcl - и особенно команды if; ошибки в оценке (в отличие от грубого основного синтаксиса) сообщаются во время выполнения команды. Я понимаю ваше разочарование по этому поводу и предлагаю вам зайти на вики-страницу Tcler , посвященную инструментам статического синтаксического анализа, которые могут выявить потенциальные проблемы для вас (при очень скромных предположениях, которые практически всегда верны). В частности, я слышал хорошие отзывы о Frink и инструменте проверки в TDK (последний является коммерческим инструментом, но очень высокого качества).

3 голосов
/ 17 ноября 2011

Чтобы уточнить ответ Донала, 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} строка имеет правильное количество аргументов без запуска программы

TCL на самом деле практически не имеет синтаксиса, нет ничего, что компилятор может проверить, лучшее, что вы можете сделать, это предупреждения в стиле Lint, которые будут точны только в некоторыхслучаи

0 голосов
/ 03 марта 2015

Есть статическая проверка синтаксиса tcl, которая может найти такие проблемы.

Вот список таких чеков: http://wiki.tcl.tk/3162

Ttclchecker http://www.xdobry.de/ttclcheck выдает следующее сообщение об ошибке для этого короткого скрипта

stackoverflow.tcl:4: error in expression missing operator <<{}>>
0 голосов
/ 15 октября 2013

Tcl не находит ошибок во время компиляции, но мы можем проверить синтаксис, используя regexp . Совпадение с шаблоном "elseif {". Если есть, проверьте, есть ли какие-либо символы в фигурной скобке "}". Если ничего не найдено, выведите сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...