Мы можем использовать для этого полудокументированную утилиту mtree
.
Давайте возьмем, к примеру, файл .m
, который содержит определение самого класса mtree
.
dbtype mtree
урожайность (это только начало):
1 classdef mtree
2 %MTREE Create and manipulate M parse trees
3 % This is an experimental program whose behavior and interface is likely
4 % to change in the future.
5
6 % Copyright 2006-2016 The MathWorks, Inc.
7
8 properties (SetAccess='protected', GetAccess='protected', Hidden)
9 T % parse tree array
Теперь, если мы вызовем утилиту mtree
для себя и покажем результат в виде текста,
tree = mtree('mtree.m','-file');
tree.dumptree()
вот что мы получаем (опять же, только начало):
1 *: CLASSDEF: 1/01
3 *Cexpr: ID: 1/10 (mtree)
4 *Body: PROPERTIES: 8/05
5 *Attr: ATTRIBUTES: 8/16
6 *Arg: ATTR: 8/26
7 *Left: ID: 8/17 (SetAccess)
8 *Right: CHARVECTOR: 8/27 ('protected')
9 >Next: ATTR: 8/49
10 *Left: ID: 8/40 (GetAccess)
11 *Right: CHARVECTOR: 8/50 ('protected')
12 >Next: ATTR: 8/63
13 *Left: ID: 8/63 (Hidden)
14 *Body: EQUALS: 9/09
Как видно из вышесказанного, комментарий и пустые строки (2-7) не появляются в левой части «дробей» в выводе. Так что, если мы найдем способ получить «числители», мы получим номера строк, которые содержат реальный код.
Нам повезло, так как существует метод, который дает нам эти числители - lineno
! Поэтому, если мы вызовем его и применим unique
к выводу, мы получим ровно одну копию каждой строки:
uLines = unique(tree.lineno);
nCodeLines = numel(uLines);
Это дает значение 269
для nCodeLines
в R2018b. Если вы хотите предположить, что последняя строка в файле всегда является строкой кода (а не комментарием или пробелом), вы можете просто вычесть nCodeLines
из последнего элемента uLines
, чтобы получить сумму строки комментариев (121
в данном случае). В противном случае используйте другой метод для подсчета общего количества строк ( пример ).
Осталось только написать это как функцию и передать в нее папку .m
файлов:)