2010-09-13 2 views
1

Je suis actuellement en train de réparer une ancienne application VBA (Visual basic for applications). J'ai un outil hérité qui analyse cette application et imprime des variables mortes. Comme il y en a plus de 2000, je ne veux pas le faire à la main.Utilisation de antlr pour supprimer le code mort

Par conséquent j'ai eu l'idée de transformer les fichiers de code séparés qui contiennent la variable morte selon l'outil susmentionné en ASTs et de les supprimer de cette façon.

Ma question: Y a-t-il une manière recommandée de faire ceci? Je ne veux pas utiliser StringTemplate, car je devrais créer des gabarits pour toutes les règles et si j'avais une recommandation sur le canal caché, ce serait perdu, n'est-ce pas? Tout ce dont j'ai besoin est d'enlever des parties de ce code et d'imprimer le reste tel qu'il a été lu.

Quelqu'un a des recommandations, s'il vous plaît?

+0

Une variable peut ne pas être consultée pour la sortie finale, qui est une forme de mort. Ou cela pourrait être déclaré mais jamais utilisé. Comment savez-vous que les variables sont mortes? Que signifie "supprimer"? Sortez tout le code qui calcule une variable particulière? –

+0

Salut! Merci d'essayer de m'aider. J'ai déjà choisi d'opter pour une autre résolution -> Je l'ai fait à la main. Ce n'était pas beaucoup de travail, mais j'aurais aimé la manière automatisée ;-) –

Répondre

0

Un peu de théorie

Je suppose que les expressions régulières ne suffisent pas à résoudre votre tâche. C'est-à-dire que vous ne pouvez pas définir la notion de section de code mort dans un langage ordinaire et espérer l'exprimer dans un langage sans contexte décrit par une grammaire antlr.

L'algorithme

L'algorithme suivant peut être proposé:

  1. Tokenize code source avec un lexer. Puisque vous voulez conserver tout le code correct - ne sautez pas ou ne cachez pas ses jetons. Assurez-vous de définir des jetons distincts pour les parties qui peuvent être supprimées ou qui seront utilisées pour déterminer le code mort, tous les autres caractères peuvent être collectés sous un seul type de jeton. Ici, vous pouvez utiliser la sortie de votre outil auxiliaire dans les prédicats pour réduire le nombre de jetons générés. Je suppose que la tokenization d'antlr (comme n'importe quelle autre tokenization) est exprimée dans une langue régulière ainsi vous ne pouvez pas enlever tout le code mort sur cette étape.

  2. Construire AST avec un analyseur. Ici, toutes les puissances d'un langage sans contexte peuvent être appliquées - définissez les sections de code mort dans les règles de l'analyseur et supprimez-le de l'AST en cours de construction.

  3. Convertissez AST en code source. Vous pouvez utiliser un analyseur d'arbre ici, mais je suppose qu'il existe un moyen plus facile qui peut être trouvé en observant toString et des méthodes similaires d'un type d'arbre retourné par l'analyseur.

Questions connexes