125 votes

Détecter le langage de programmation à partir d'un extrait de texte

Quel serait le meilleur moyen de détecter le langage de programmation utilisé dans un extrait de code ?

1 votes

Il existe pratiquement un nombre infini de langues... voulez-vous en détecter une seule ? Ou est-ce qu'on parle seulement des langues les plus populaires ?

0 votes

Seulement les plus populaires (C/C++, C#, Java, Pascal, Python, VB.NET. PHP, JavaScript et peut-être Haskell).

13 votes

Haskell ne doit pas être populaire puisque je n'en ai jamais entendu parler ;-)

1voto

Toon Krijthe Points 36327

Joli puzzle.

Je pense qu'il est impossible de détecter toutes les langues. Mais vous pourriez vous déclencher sur des tokens clés (certains mots réservés et des combinaisons de caractères souvent utilisées).

Ben il y a beaucoup de langues avec une syntaxe similaire. Cela dépend donc de la taille de l'extrait.

1voto

Hawkee Points 1341

Prettify est un paquet Javascript qui fait un travail correct de détection des langages de programmation :

http://code.google.com/p/google-code-prettify/

Il s'agit principalement d'un surligneur syntaxique, mais il existe probablement un moyen d'extraire la partie détection pour détecter la langue à partir d'un extrait.

1 votes

Après une inspection plus poussée, il semble que prettify ne détecte pas réellement la langue, mais qu'il met en évidence la syntaxe de chaque élément.

1voto

drkvogel Points 61

Ce site semble être assez bon pour identifier les langues, si vous voulez un moyen rapide de coller un extrait dans un formulaire Web, plutôt que de le faire par programme : http://dpaste.com/

0voto

Noldorin Points 67794

Je ne pense pas qu'il y ait un moyen facile d'y parvenir. Je produirais probablement des listes de symboles/mots-clés communs uniques à certains langages/classes de langages (par exemple, les accolades pour le langage de style C, les mots-clés Dim et Sub pour les langages BASIC, le mot-clé def pour Python, le mot-clé let pour les langages fonctionnels). Vous pourrez ensuite utiliser les caractéristiques de base de la syntaxe pour réduire encore davantage votre champ de recherche.

0voto

Mark Points 49079

Je pense que la plus grande distinction entre les langues est leur structure. Mon idée serait donc d'examiner certains éléments communs à toutes les langues et de voir comment ils diffèrent. Par exemple, vous pourriez utiliser des regex pour sélectionner des éléments tels que :

  • définitions des fonctions
  • déclarations de variables
  • déclarations de classes
  • commentaires
  • pour les boucles
  • Boucles "while
  • imprimer les déclarations

Et peut-être quelques autres choses que la plupart des langues devraient avoir. Ensuite, utilisez un système de points. Accordez au maximum 1 point pour chaque élément si la regex est trouvée. Évidemment, certains langages utiliseront exactement la même syntaxe (les boucles for sont souvent écrites de la manière suivante for(int i=0; i<x; ++i) Ainsi, plusieurs langues pourraient chacune marquer un point pour la même chose, mais au moins vous réduisez la probabilité qu'il s'agisse d'une langue totalement différente). Certains d'entre eux pourraient obtenir des 0 sur toute la ligne (le snippet ne contient pas de fonction, par exemple), mais c'est tout à fait normal.

Combinez cela avec la solution de Jules, et cela devrait fonctionner assez bien. Vous pouvez également rechercher les fréquences des mots-clés pour un point supplémentaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X