代码之家  ›  专栏  ›  技术社区  ›  PeterK

在文本文件中识别编程语言的代码[关闭]

  •  16
  • PeterK  · 技术社区  · 14 年前

    • 我必须用C++写这个。
    • 应该认识到各种各样的语言——HTML、PHP、Perl、Ruby、C、C++、爪哇、C…
    • 它应该有一个很好的精度/速度比(速度更受青睐)

    如果代码能够以这样一种方式编写,即为识别添加新语言将相当容易,并且只需要为特定语言添加“设置/数据”,那将是非常好的。我可以用任何可用的东西-启发式,神经网络,黑魔法。什么都行。我甚至可以使用现有的解决方案,但是:解决方案必须是免费的,开源的,并允许商业使用。它必须以易于集成的源代码或静态库的形式出现-没有DLL。然而,我更喜欢编写自己的代码或只是使用另一个解决方案的片段,我厌倦了集成其他解决方案的代码。最后一点:也许你们中的一些人会建议FANN(快速人工神经网络库)-这是我唯一不能使用的东西,因为这是我们已经使用的东西,我们想取代它。

    编辑: 根据评论和答案,我必须强调一些我忘记的事情:速度是非常关键的,因为这将得到数千个文件,而且应该回答得很快,所以查看一千个文件最多应该在几秒钟内为所有这些文件生成答案(文件的大小当然会很小,每个文件只有几kB)。所以试图编译每一个都是不可能的。问题是,我真的希望每种语言都有概率,所以我更想知道文件可能是C或C++,但它是BASH脚本的几率很低。由于代码模糊,评论等,我认为,寻找一个100%准确的代码是一个坏主意,事实上不是这个目标。

    10 回复  |  直到 14 年前
        1
  •  11
  •   Daniel    14 年前

    你有问题吗 document classification naive bayes classifiers support vector machines . 在文章中,有一些实现这些算法的库的链接,其中许多都有C++接口。

        2
  •  7
  •   Leonid    14 年前

    我能想到的一个简单的解决方案是,你可以识别不同语言中使用的关键字。每个识别出的单词都有+1分。然后计算比率=确定的单词/总单词。得分最高的语言是赢家。当然也有一些问题,比如评论e.t.c.的使用,但我认为这是一个非常简单的解决方案,在大多数情况下应该是可行的。

        3
  •  3
  •   C.J.    14 年前

    很抱歉,如果你要分析成千上万个文件,那么你最好看 文件扩展名 . 不要过度设计一个简单的问题,或把繁重的要求放在一个简单的任务上。

    听起来你有成千上万的源代码文件,却不知道它们是用什么编程语言编写的。你在什么样的编程环境中工作?(排除人工作业要求的可能性)我的意思是,软件工程的基础知识之一,我可以一直依赖的是,c++代码文件有.cpp扩展名,java代码文件有.java扩展名,c代码文件有.c扩展名等等。。。贵公司是否在严格执行这些标准?如果是这样的话,我真的很担心。

        4
  •  2
  •   Dave McClelland    14 年前

    如果您不能使用文件扩展名,最好的方法是找到不同语言之间最不同的内容,并使用这些内容来确定文件类型。例如,For循环语句的语法在不同语言之间不会有太大的差异,但包include语句应该是相同的。如果你有文件包括java.util文件那么你就知道这是一个java文件了。

        5
  •  2
  •   Eric O. Lebigot    14 年前

    正如dmckee所建议的,您可能想看看Unix file 程序,谁的 source is available

        6
  •  1
  •   Kornel Kisielewicz    14 年前

    看一看 nedit 语法突出显示->识别模式 here ,或者下载程序并查看标准程序。

    以下是对 highlighting system .

        7
  •  1
  •   DmitryK    14 年前

    因为语言列表是预先知道的,所以你知道每种语言的语法。

    如果最后你只剩下一种可能-这是你的语言。 如果你太快到达程序的结尾,那么(从你停止的地方)你可以分析你在树上的位置,找出哪些语言仍然是可能的。

        8
  •  0
  •   Cedric H.    14 年前

    您可以尝试考虑语言的差异,并用二叉树对这些差异进行建模,比如“是否找到了featurex?”如果是,则朝一个方向行驶,如果不是,则朝另一个方向行驶。

        9
  •  0
  •   grigy    14 年前

    这一个不快,可能不能满足您的要求,但只是一个想法。它应该很容易实施,应该给100%的结果。

    您可以尝试使用不同的编译器/解释器(开源或免费)编译/执行输入文本,并检查幕后的错误。

        10
  •  0
  •   Gian    14 年前

    这个 Sequitur