Question

Je suis dépoussiérer un vieux projet de la mine qui calcule un certain nombre de mesures simples sur les grands projets logiciels. L'une des mesures est la longueur des fichiers / classes / méthodes. À l'heure actuelle mon code « devine » où les frontières de classe / méthode sont basées sur un algorithme très brut (parcourir le fichier, le maintien d'une « profondeur actuelle » et en ajustant chaque fois que vous rencontrez sans guillemets entre parenthèses, quand vous revenez au niveau d'une classe ou méthode a commencé à , considèrent qu'il est sorti). Cependant, il y a beaucoup de problèmes avec cette procédure, et d'une manière « simple » de détection lorsque votre profondeur a changé est pas toujours efficace.

Pour cela donne des résultats précis, je dois utiliser la manière canonique (dans chaque langue) de détection des définitions de fonctions, des définitions de classe et les changements de profondeur. Cela revient à écrire un analyseur simple pour générer des arbres parse contenant au moins ces éléments pour chaque langue que je veux que mon projet soit applicable à.

De toute évidence parseurs ont été écrites pour toutes ces langues avant, donc il semble que je ne devrais pas avoir à dupliquer cet effort (même si l'écriture est amusant parseurs). Y at-il un certain projet open-source qui recueille les bibliothèques d'analyseur prêt à utiliser pour un tas de langues source? Ou devrais-je être juste en utilisant ANTLR pour faire mon propre à partir de zéro (Note: Je serais ravi de porter le projet à une autre langue pour faire usage d'une ressource existante, donc si vous en connaissez un, il Peu importe ce que la langue, il est écrit dans.)

Était-ce utile?

La solution

Si vous voulez l'analyse syntaxique de langage précis, en particulier face à des complications linguistiques telles que les macros et les conditions du préprocesseur, vous avez besoin parseurs pleine langue. Ce sont en fait tout à fait beaucoup de travail pour construire, et la plupart des langues ne se prêtent pas bien aux différents types de générateurs d'analyseur autour. Ne sont la plupart des auteurs d'un analyseur de langage intéressé par d'autres langauges; ils ont tendance à choisir un certain générateur d'analyseur syntaxique est évidemment pas un obstacle énorme quand ils commencent, mettre en œuvre leur analyseur dans le but spécifique qu'ils ont l'intention, et passer à autre chose.

Consequence: il y a très peu de bibliothèques de définitions linguistiques autour qui sont définis à l'aide d'un seul formalisme ou une fondation commune. La foule ANTLR maintient l'un des ensembles à mon humble avis de plus, bien que pour autant que je peux dire la plupart de ces parseurs ne sont pas tout à fait capable production. Il y a toujours Bison, qui a été assez longtemps pour que vous vous attendez une bibliothèque de définitions langauge à recueillir quelque part, mais je ne l'ai jamais vu.

J'ai passé les 15 dernières années, la définition des machines de base pour l'analyse des programmes et de la transformation, et la construction d'une autre telle bibliothèque, appelée DMS Software Reengineering Toolkit . Il a parseurs de qualité de production pour C, C ++, C #, Java, COBOL (IBM Enterprise version), JCL, PHP, Python, etc. Votre opinion peut bien sûr varier de la mienne, mais ceux-ci sont utilisés quotidiennement avec DMS pour effectuer des tâches de changement de masse sur les grands organismes de code.

Je ne connais pas d'autres où l'ensemble des définitions de langauge sont arrivés à maturité et construit sur une base unique ... il se peut que les compilateurs d'IBM sont un tel ensemble, mais IBM ne propose pas l'appareil ou définitions linguistiques.

Si tout ce que vous voulez faire est de mesures simples de calcul, vous pourriez être en mesure de vivre avec seulement lexers et ad hoc de comptage des nids (comme vous l'avez décrit). Même c'est plus difficile qu'il n'y paraît pour le faire fonctionner à droite dans la plupart des cas (consultez Python, Perl chaîne fou et PHP syntaxes). Quand tout est dit et fait, même C est une quantité surprenante de travail juste pour définir un lexer précis. Nous avons plusieurs milliers de lignes d'expressions régulières sophistiquées pour couvrir tous les lexèmes étranges que vous trouvez dans Microsoft et / ou GNU C

Parce que DMS a toujours défini, parseurs mature pour de nombreuses langues, il en résulte que DMS a toujours défini, lexers matures pour les mêmes langauges. Nous construisons en fait un code source moteur de recherche (SCSE) qui permet une recherche rapide à travers les grands organismes de codes en plusieurs langues qui fonctionne par lexing les langues qu'il rencontre et l'indexation de ces lexèmes pour la recherche rapide. Le SCSE se trouve juste à calculer le genre de mesures dont vous parlez, aussi, comme il indexe la base de code, à peu près la façon dont vous décrivez, sauf qu'il a ces langauage lexers précises à utiliser.

Autres conseils

Vous pourriez être intéressé par gcc-xml si vous analysez C ++. Java CUP a pour la langue grammaires Java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top