【问题标题】:How to tell if Matlab code is syntactically valid?如何判断 Matlab 代码在语法上是否有效?
【发布时间】:2013-12-18 21:57:31
【问题描述】:

我正在为 Matlab 开发一个解析器,使用来自 Matlab Central File Exchange 的一大堆代码作为测试数据。在筛选其中一些代码时,我发现我合法下载的一些代码不应该解析(即 Matlab 本身不会接受它)。

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

【问题讨论】:

  • 查找 CHECKCODE/MLINT 或未记录的 MTREE 函数
  • 听起来很有趣.. 出于好奇,您的项目可以公开访问吗?
  • @Amro 它是麦吉尔大学 McLab 项目的一部分 (sable.mcgill.ca/mclab, github.com/Sable/mclab)。我认为说“我正在研究解析器”更简单,但这并不完全正确:s
  • 非常好!下面看看有多少提交使用了这些解析函数:mcbench.cs.mcgill.ca/…

标签: matlab parsing


【解决方案1】:

如果您愿意使用未记录的函数,请考虑以下事项:

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/')

【讨论】:

  • 这似乎接近我想要的,但它似乎并没有捕捉到所有的语法错误。例如,Matlab 对[1,,2] 给出错误,但mtree('[1,,2]') 没有。我猜 Matlab 出于某种原因在解析阶段后捕获了该错误?
  • 嗯,你是对的!实际上它似乎纠正了它:) tree2str(mtree('[1,,2]')) 返回[1,2]。试试我建议的其他解决方案..
【解决方案2】:

自 2011b 以来,解析 Matlab 代码的方式是通过 checkcode。在旧版本的 Matlab 中,您可以使用 mlint(在 R2013a+ 中,可能更早的版本中,此命令只调用 checkcode)。这两者都依赖于一个名为mlintmex 的私有未记录函数。你可以了解更多关于这个功能和相关主题on the Undocumented Matlab website

另一个可能相关的项目是Linguist,GitHub 和其他人使用它对语言进行分类,并使用pygments.rb 突出显示代码。它支持Matlab。前段时间,Matlab 支持曾经屡试不爽,但我认为它已经有所改进。这些不会验证代码,但它们可能对您正在做的事情有用。

【讨论】:

  • 有没有办法区分语法错误和其他问题?我在这里遇到与其他答案相同的问题;例如[1,,2] 收到类似 a comma cannot immediately follow another comma 的警告,而其他人则收到 parse error 的警告,这很容易找到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2011-06-03
相关资源
最近更新 更多