解析源代码 - 不同语言的唯一标识符?

Roe*_*ler 11 language-agnostic parsing programming-languages

我正在构建一个接收源代码作为输入的应用程序,并分析代码的几个方面.它可以接受来自许多常用语言的代码,例如C/C++,C#,Java,Python,PHP,Pascal,SQL等(但是许多语言都不受支持,例如Ada,Cobol,Fortran).知道语言之后,我的应用程序知道该怎么做(我有不同语言的处理程序).

目前我要求用户输入编写代码的编程语言,这很容易出错:尽管用户知道编程语言,但由于鲁莽,他们中的一小部分(在极少数情况下)会点击错误的选项,这打破了系统(即我的分析失败).

在我看来,应该有一种方法可以从输入文本本身中找出(在大多数情况下)语言是什么.几点说明:

  • 我收到纯文本而不是文件名,所以我不能使用扩展名作为提示.
  • 用户不需要输入完整的源代码,也可以输入代码片段(即可以不包括包含/导入部分).
  • 我很清楚,我选择的任何算法都不是100%证明,当然对于非常短的输入代码(例如,Python和Ruby都可以接受),在这种情况下我仍然需要用户的帮助,但我想尽量减少用户参与流程以最大限度地减少错误.

例子:

  • 如果文本包含"x-> y()",我可能确定它是C++(?)
  • 如果文本包含"public static void main",我可能肯定知道它是Java(?)
  • 如果文本包含"for x:= y to z do begin",我可能确定它是Pascal(?)

我的问题:

  1. 您是否熟悉任何标准库/方法,以自动确定输入源代码的语言是什么?
  2. 什么是独特的代码"令牌",我当然可以将一种语言与另一种语言区分开来?

我正在用Python编写代码,但我认为这个问题与语言无关.

谢谢

小智 7

Vim具有自动检测文件类型功能.如果您下载vim源代码,您将找到/vim/runtime/filetype.vim文件.

对于每种语言,它检查文件的扩展名,并且对于其中一些(最常见),它有一个函数可以从源代码中获取文件类型.你可以检查一下.代码很容易理解,并且有一些非常有用的注释.

  • Aaron:"还有一些(最常见的)有一个函数可以从源代码中获取文件类型".即使是注释的代码,它完全符合OP的要求,也符合-1的要求? (4认同)
  • +1来纠正downvote :) (4认同)
  • @Aaron:老兄至少阅读投票或发帖之间的全部答案......我知道我的英语不是那么好,但似乎约翰内斯得到了:) (3认同)
  • +1来过度修正downvote (2认同)

BCS*_*BCS 7

构建一个通用的标记化器,然后对它们使用贝叶斯过滤器.使用现有的"用户检查框"系统来训练它.

  • 我建议使用这种技术向用户推荐语言.如果他们确定它是错的,让他们改写它的猜测. (2认同)

Ore*_*ost 2

一些想法:

$x->y() 在 PHP 中是有效的,所以如果你认为 C++ 的话请确保没有 $ 符号(尽管我认为你可以在 C 结构中存储函数指针,所以这也可以是 C)。

public static void main如果大小写正确的话,它是 Java - 写 Main 并且它是 C#。如果您考虑不区分大小写的语言(例如许多脚本语言或 Pascal),这会变得复杂。另一方面,C# 中的 [] 属性语法似乎相当独特。

你也可以尝试使用一种语言的关键字——例如,典型的Option Strict或者End Sub是VB之类的,而yield很可能是C#和initialization/implementation或Object Pascal/Delphi。

如果您的应用程序无论如何都在分析源代码,那么您的代码会尝试为每种语言添加分析代码,如果它失败得很严重,那么它就是错误的语言:)