如何判断Matlab代码在语法上是否有效?

时间:2013-12-18 21:57:32

标签: matlab parsing

我正在使用Matlab的解析器,使用Matlab中央文件交换中的一大堆代码作为测试数据。在筛选其中一些时,我发现我合法下载的一些代码不应该解析(即Matlab本身不会接受它)。

有没有一种简单的方法来检查m文件(函数或脚本)是否包含语法错误 - 可能是某些库函数?我不打算运行代码,只是看它是否应该解析。

2 个答案:

答案 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的支持曾经被击中过,但我认为它有所改进。这些不会验证代码,但它们可能对您正在进行的操作很有用。