2011-11-17 29 views
6

Tôi đã phát triển một số mã và tôi đang gặp sự cố với việc gắn cờ lỗi của trình thông dịch Tcl trên máy Linux.Phát hiện lỗi trong các kịch bản Tcl

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

Đoạn mã trên là không suy giảm lỗi cho "elseif" điều kiện cho đến khi nó nhận được vào điều kiện elseif. Có cách nào để kiểm tra loại lỗi đánh máy này được thực hiện không cố ý.

Cảm ơn trước!

+1

Một cú pháp tốt làm nổi bật trong trình soạn thảo của bạn có thể giúp đỡ. – schlenk

+0

@schlenk chẳng hạn như ...? – Thufir

Trả lời

2

Để giải thích câu trả lời của Donal, Tcl không tìm thấy lỗi tại thời gian biên dịch vì trong trường hợp chung không thể thực hiện được, bất kỳ mã nào được thực thi trước nếu có thể đã xác định lại lệnh if, vì vậy nó có thể hợp lệ, cách duy nhất để xác định xem đây là trường hợp là để chạy mã (tức là đây là vấn đề ngăn chặn)

xem xét kịch bản này:

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

rõ ràng nó là không thể để tĩnh xác định xem nếu {1} dòng có số lượng đối số phù hợp mà không cần chạy chương trình

TCL thực sự hầu như không có cú pháp, không có trình biên dịch nào có thể kiểm tra, tốt nhất bạn có thể làm là cảnh báo kiểu Lint, điều này sẽ chỉ chính xác trong một số trường hợp:

5

Tcl không tìm thấy lỗi tại thời gian biên dịch và trong mẫu ở trên, nó có thể xác định rằng nó sẽ không bao giờ cần kiểm tra các mệnh đề elseif ngay từ đầu; nó chỉ phát hành trực tiếp puts đầu tiên.

Hiện tại, trong trường hợp có điều kiện đầu tiên không nhỏ, đó là trường hợp các lỗi trong biểu thức elseif không được báo cáo cho đến khi đạt được. Đây là cách ngữ nghĩa của Tcl - và đặc biệt là lệnh if - được định nghĩa; lỗi trong đánh giá (trái với tổng cú pháp chính) được báo cáo tại thời điểm thực hiện lệnh. Tôi có thể hiểu được sự thất vọng của bạn với điều này và khuyên bạn nên xem Tcler's Wiki page về các công cụ phân tích cú pháp tĩnh, có thể gắn cờ các vấn đề tiềm ẩn cho bạn (theo các giả định rất khiêm tốn hầu như luôn đúng). Đặc biệt, tôi đã nghe những điều tốt đẹp về Frinkthe checker tool in TDK (sau này là một công cụ thương mại, nhưng chất lượng rất cao).

+3

[Nagelfar] (http://nagelfar.berlios.de/) là một tùy chọn khác cho trình kiểm tra cú pháp Tcl tĩnh. – schlenk

+0

@schlenk: +1; Tôi cũng nên ghi nhớ điều đó. –

0

Tcl không tìm thấy lỗi tại thời gian biên dịch. có thể kiểm tra cú pháp bằng cách sử dụng regexp. Khớp mẫu "elseif {", Nếu hiện tại kiểm tra xem có bất kỳ ký tự nào trong dấu ngoặc nhọn "}" không. Nếu không có gì thì in một thông báo lỗi.

0

Có trình kiểm tra cú pháp tĩnh tcl có thể tìm thấy các vấn đề như vậy.

Dưới đây là danh sách các checkes như: http://wiki.tcl.tk/3162

Các ttclchecker http://www.xdobry.de/ttclcheck sản xuất sau thông báo lỗi cho kịch bản ngắn này

stackoverflow.tcl:4: error in expression missing operator <<{}>> 
Các vấn đề liên quan