2016-12-20 13 views
6

Máy phân tích mã MATLAB có rất nhiều gợi ý tốt đẹp về cách sửa lỗi và không hiệu quả, nhưng đôi khi tôi gặp phải các tình huống mà tôi muốn bị máy phân tích đánh bắt. Cụ thể là tôi đang nghĩ đến việc mã như sau:Tôi có thể thực hiện cảnh báo phân tích mã MATLAB tùy chỉnh không?

if numel(list > x) 
    ... 
end 

tôi không thể ra khỏi đỉnh đầu của tôi nghĩ ra bất kỳ tình huống mà tôi cần phải sử dụng mã ở trên trong khi đoạn mã sau:

if numel(list) > x 
    ... 
end 

thường được sử dụng.

Tôi đã xem qua danh sách những điều có thể trình phân tích mã có thể cảnh báo tôi và tôi không tìm thấy khả năng này.

Vì vậy, câu hỏi của tôi là: Có thể thêm cảnh báo của riêng tôi vào trình phân tích mã hay không và nếu có thì làm cách nào?

Tôi nhận ra rằng nếu có thể nó có thể là một nhiệm vụ khó khăn, vì vậy mọi giải pháp thay thế hoặc giải pháp thay thế cho vấn đề cụ thể cũng sẽ được đánh giá cao!

+0

Bạn nên xem [bài viết] này (http://undocumentedmatlab.com/blog/parsing-mlint-code-analyzer-output) – obchardon

Trả lời

2

Tôi không tin rằng có cách thêm mẫu mã mới cho số MATLAB Code Analyzer để tìm kiếm. Tất cả những gì bạn có thể làm là đặt cảnh báo hiện có nào được hiển thị hoặc bị chặn.

Tôi không chắc chắn loại công cụ của bên thứ ba nào có thể có để phân tích mã, và việc tạo một máy phân tích mục đích chung cho bản thân bạn sẽ khá khó khăn. Tuy nhiên, nếu có một vài mẫu rất cụ thể, được xác định rõ bạn muốn thử và tô sáng trong mã của mình, bạn có thể thử phân tích cú pháp bằng regular expressions (âm thanh đáng sợ và la hét).

Điều này thường có thể khó, nhưng có thể thực hiện được. Ví dụ, tôi đã viết đoạn mã này tìm kiếm mẫu mà bạn đề cập ở trên. Một trong những điều mà thường phải được quản lý khi thực hiện một cái gì đó như thế này được chiếm bộ ngoặc kèm theo, mà tôi xử lý bằng cách đầu tiên loại bỏ cặp phi thú vị của dấu ngoặc đơn và nội dung của họ:

function check_code(filePath) 

    % Read lines from the file: 
    fid = fopen(filePath, 'r'); 
    codeLines = textscan(fid, '%s', 'Delimiter', '\n'); 
    fclose(fid); 
    codeLines = codeLines{1}; 

    % Remove sets of parentheses that do not encapsulate a logical statement: 
    tempCode = codeLines; 
    modCode = regexprep(tempCode, '\([^\(\)<>=~\|\&]*\)', ''); 
    while ~isequal(modCode, tempCode) 
    tempCode = modCode; 
    modCode = regexprep(tempCode, '\([^\(\)<>=~\|\&]*\)', ''); 
    end 

    % Match patterns using regexp: 
    matchIndex = regexp(modCode, 'numel\([^\(\)]+[<>=~\|\&]+[^\(\)]+\)'); 

    % Format return information: 
    nMatches = cellfun(@numel, matchIndex); 
    index = find(nMatches); 
    lineNumbers = repelem(index, nMatches(index)); 
    fprintf('Line %d: Potential incorrect use of NUMEL in logical statement.\n', ... 
      lineNumbers); 

end 
% Test cases: 
% if numel(list < x) 
% if numel(list) < x 
% if numel(list(:,1)) < x 
% if numel(list(:,1) < x) 
% if (numel(list(:,1)) < x) 
% if numel(list < x) & numel(list < y) 
% if (numel(list) < x) & (numel(list) < y) 

Thông báo tôi đã thêm một số kiểm tra các trường hợp trong các ý kiến ​​ở dưới cùng của tập tin. Khi tôi chạy mã này trên chính nó, tôi có được điều này:

>> check_code('check_code.m') 
Line 28: Potential incorrect use of NUMEL in logical statement. 
Line 31: Potential incorrect use of NUMEL in logical statement. 
Line 33: Potential incorrect use of NUMEL in logical statement. 
Line 33: Potential incorrect use of NUMEL in logical statement. 

Chú ý rằng một thông điệp được liệt kê cho, thứ tư, và các trường hợp thử nghiệm thứ sáu đầu tiên mà phù hợp với mã sai lầm của mình (hai lần đối với trường hợp kiểm tra thứ sáu, kể từ khi có là hai lỗi trên dòng đó).

Thao tác này có hoạt động cho tất cả các tình huống có thể xảy ra không? Tôi sẽ giả định là không. Bạn có thể sẽ phải tăng độ phức tạp của các mẫu regex để xử lý các tình huống bổ sung. Nhưng ít nhất điều này có thể phục vụ như là một ví dụ về những thứ bạn phải cân nhắc khi phân tích cú pháp mã.

Các vấn đề liên quan