Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Programming languages 从代码段检测编程语言_Programming Languages_Language Detection - Fatal编程技术网

Programming languages 从代码段检测编程语言

Programming languages 从代码段检测编程语言,programming-languages,language-detection,Programming Languages,Language Detection,检测代码片段中使用哪种编程语言的最佳方法是什么?这取决于您拥有的代码片段的类型,但我会通过一系列标记器运行它,并查看它所针对的是哪种语言的BNF。首先,我会尝试找到一种语言的特定关键字,例如 "package, class, implements "=> JAVA "<?php " => PHP "include main fopen strcmp stdout "=>C "cout"=> C++ etc... “包、类、实现”=>JAVA “我认为垃圾邮件过滤器

检测代码片段中使用哪种编程语言的最佳方法是什么?

这取决于您拥有的代码片段的类型,但我会通过一系列标记器运行它,并查看它所针对的是哪种语言的BNF。

首先,我会尝试找到一种语言的特定关键字,例如

"package, class, implements "=> JAVA
"<?php " => PHP
"include main fopen strcmp stdout "=>C
"cout"=> C++
etc...
“包、类、实现”=>JAVA

“我认为垃圾邮件过滤器中使用的方法会非常有效。您可以将代码段拆分为单词。然后将这些单词的出现情况与已知代码段进行比较,并计算您感兴趣的每种语言的该代码段以X语言编写的概率

如果你有基本的机制,那么添加新的语言就很容易了:只需用新语言中的一些片段来训练检测器(你可以为它提供一个开源项目)。这样它就知道“系统”很可能出现在C代码片段中,而“puts”则出现在Ruby代码片段中

事实上,我已经使用此方法将语言检测添加到论坛软件的代码段中。它在100%的时间内都有效,但在不明确的情况下除外:

print "Hello"
让我找到密码

我找不到代码,所以我做了一个新的。这有点简单,但它适用于我的测试。目前,如果您为它提供的Python代码比Ruby代码多得多,则可能会说以下代码:

def foo
   puts "hi"
end
是Python代码(尽管它实际上是Ruby)。这是因为Python也有一个
def
关键字。因此,如果它在Python中看到1000x
def
,在Ruby中看到100x
def
,那么它可能仍然会说Python,即使
put
end
是特定于Ruby的。您可以通过跟踪每种语言看到的单词并在某个地方除以这些单词来解决这个问题(或者用每种语言向它输入等量的代码)

我希望它能帮助你:

类分类器
def初始化
@数据={}
@总计=散列。新建(1)
结束
定义字(代码)
代码。拆分(/[^a-z]/)。拒绝{{w{w.empty?}
结束
def序列(代码,lang)
@总计[lang]+=1
@数据[lang]| |=散列。新建(1)
单词(代码)。每个{w}@data[lang][w]+=1}
结束
def分类(代码)
ws=单词(代码)
@data.keys.max_by do|lang|
#我们真的想在这里乘法,但我使用日志
#避免浮点下溢
#(添加日志相当于乘法)
Math.log(@totals[lang])+
ws.map{| w | Math.log(@data[lang][w])}.reduce(:+)
结束
结束
结束
#示例用法
c=分类器。新
#从文件中训练
c、 列车(打开(“code.rb”).read,:ruby)
c、 火车(打开(“code.py”).read,:python)
c、 列车(打开(“代码cs”)。读取:csharp)
#在另一个文件上测试它
c、 分类(open(“code2.py”).read)#=>:python(希望如此)
漂亮的拼图

我认为检测所有语言是不可能的。但是你可以在关键标记上触发(某些保留字和常用的字符组合)


Ben有很多语言具有相似的语法。因此这取决于代码片段的大小。

我不认为有一种简单的方法可以做到这一点。我可能会生成特定语言/语言类特有的符号/常用关键字列表(例如,C风格语言的花括号、基本语言的Dim和Sub关键字、Python的def关键字、函数语言的let关键字)。然后,您可以使用基本语法功能进一步缩小范围。

这非常困难,有时甚至不可能。这一简短片段来自哪种语言

int i = 5;
int k = 0;
for (int j = 100 ; j > i ; i++) {
    j = j + 1000 / i;
    k = k + i * j;
}
(提示:可以是多个选项中的任意一个。)

您可以尝试分析各种语言,并尝试使用关键字的频率分析来决定。如果某些关键字集在文本中以特定频率出现,则很可能是Java等语言。但我认为您不会得到任何完全防错的结果,例如,您可以将C中的变量命名为与k相同的名称Java中的eyword,频率分析将被愚弄


如果你把它的复杂性提高一个档次,你可以寻找结构,如果某个关键字总是在另一个关键字之后出现,这将为你提供更多的线索。但设计和实现起来也会困难得多。

我认为语言之间最大的区别在于它的结构。所以我的想法是在不同的语言中寻找某些共同的元素查看所有语言的差异。例如,您可以使用正则表达式来选择以下内容:

  • 函数定义
  • 变量声明
  • 类声明
  • 评论
  • for循环
  • while循环
  • 打印报表

可能还有一些其他大多数语言都应该具备的东西。然后使用积分系统。如果找到正则表达式,则每个元素最多可得1分。显然,有些语言将使用完全相同的语法(因为循环通常被写成
for(int i=0;i语言检测由其他语言解决:

Ohloh的方法:


Github的方法:

Prettify是一个Javascript包,它可以很好地检测编程语言:

它主要是语法高亮显示,但可能有一种方法可以提取检测部分,以便从代码段中检测语言。

另一种方法是使用,它执行语法高亮显示,但使用高亮显示过程的成功率来识别语言。原则上,任何语法高亮显示代码库可以以同样的方式使用,但是highlight.js的优点是语言检测被认为是一种功能,并且是一种新的功能


更新:我尝试了这个,但效果不太好。压缩的JavaScript完全混淆了它,即标记器对空格敏感。一般来说,仅计算突出显示点击数似乎不太可靠。一个更强大的解析器,或者可能是不匹配的部分计数,可能会更好。

有趣。我有一个类似的任务要完成识别不同格式的文本。YAML、JSON、XML、,
matrix S = matrix(GF(2),k,[random()<0.5for _ in range(k^2)]); while (rank(S) < k) : S[floor(k*random()),floor(k*random())] +=1;