源代码语言分析器

时间:2011-12-15 14:54:22

标签: ruby ruby-on-rails-3 code-analysis

我想用ruby检测编程语言

例如: (PHP)

$a = array("1","2","3");
print_r($a); 

(红宝石)

def index
end

什么宝石可以做到这一点?

3 个答案:

答案 0 :(得分:3)

Linguist可能会为你做这件事(GitHub用它来检测项目中的主要语言)。

如果你想建立自己的,那将是一个很好的起点。这里有一些关于你可能需要做些什么才能制作一个的注意事项。

文件扩展名是一个很好的骗子。例如:

  • .rb - 几乎总是红宝石
  • .cpp - 几乎总是C ++
  • .h - 可能是C / C ++

......等,然后逐行阅读代码。通常会有一些常用的关键词,或者这些单词在代码中的位置,这些单词会很快地提示你写出它所使用的语言。回顾一下你想要支持的语言的几个“入门”教程网站应该给你一个很好的总结这些东西,而不需要真正学习语言本身。你真正需要的只是每种语言的一些独特的东西,你可以接受,使文件最终成为一种语言或另一种语言。

您还可以使用贝叶斯学习过滤器(Ruby中有一个名为Classifier的模块)来训练更灵活的学习引擎,以便通过语言自行识别代码。由于编程语言是高度结构化的文本,因此学习软件不需要很长时间就能很好地识别语言。如果你想完全疯狂,你甚至可以训练它不仅可以识别语言,还可以识别代码可以编译的语言的最低版本。例如,在Java中,他们在语言生命周期的特定点添加了泛型。如果您在代码中看到泛型的使用,那么您就知道源代码是为某个最小版本的Java等编写的。

稍微复杂一点,但不多,将是.erb文件之类的问题。你称之为“嵌入式Ruby”,你称之为“Ruby”,还是算上HTML与Ruby与JavaScript的关系,并用最多的语言来调用它,或者你只是用ALL标记文件找到的语言?我想这更像是一个设计决定。

答案 1 :(得分:3)

Source classifier 是一个宝石,应该适用于你想做的事情。源分类器使用在“计算机语言基准游戏”生成的语料库上训练的贝叶斯分类器来识别编程语言:http://shootout.alioth.debian.org/。它是用Ruby编写的,可以作为gem使用。开箱即用SourceClassifier可识别C,Java,Javascript,Perl,Python和Ruby。使用贝叶斯分类器来识别源代码的一个很好的优点是,即使是错误的匹配仍然会提供一些可用的突出显示。要训​​练分类器以识别新语言,请从github下载源代码。

答案 2 :(得分:1)

我唯一能想到的是https://github.com/github/linguist。一个美妙的宝石,但我不认为这正是你需要的。