我正在使用Matlab的解析器,使用Matlab中央文件交换中的一大堆代码作为测试数据。在筛选其中一些时,我发现我合法下载的一些代码不应该解析(即Matlab本身不会接受它)。
有没有一种简单的方法来检查m文件(函数或脚本)是否包含语法错误 - 可能是某些库函数?我不打算运行代码,只是看它是否应该解析。
答案 0 :(得分:6)
如果您愿意使用未记录的功能,请考虑以下事项:
function isValid = checkValidMFile(file_name)
% make sure file can be found
fname = which(file_name);
assert(~isempty(fname) && exist(fname,'file')~=0, 'file not found');
% parse M-file and validate
t = mtree(fname, '-file');
if count(t) == 0 || (count(t)==1 && iskind(t,'ERR'))
isValid = false;
else
isValid = true;
end
end
(您也可以传递一串MATLAB语言代码而不是保存的文件名。)
当然mtree
会提供更多信息,它实际上可以返回解析树,以及任何警告或错误。我之前已将其用于differentiate between scripts vs. functions,并从M文件中用于strip all comments。
遗憾的是,它没有得到官方的支持,所以你必须浏览它的源代码来弄清楚一切意味着什么(幸好它的评论很好)。该函数使用内部mtreemex
MEX函数。
其他(未记录的)方式:
builtin('_mcheck', 'some_file.m')
和
checkSyntacticWarnings('./path/to/folder/')
答案 1 :(得分:4)
自2011b以来,解析Matlab代码的方法是通过checkcode
。在旧版本的Matlab中,您可以使用mlint
(在R2013a +中,也许更早,此命令只调用checkcode
)。这两个都依赖于一个名为mlintmex
的私有未记录的函数。您可以了解有关此功能和相关主题的更多信息on the Undocumented Matlab website。
另一个与潜在相关的项目是Linguist,GitHub和其他人使用该项目对语言进行分类,并使用pygments.rb突出显示代码。它支持Matlab。不久之前,Matlab的支持曾经被击中过,但我认为它有所改进。这些不会验证代码,但它们可能对您正在进行的操作很有用。