J'ai regardé les autres réponses, il apparaît que les gens sont en train de faire des backflips, afin de contourner les problèmes de calcul des numéros de ligne, lorsque votre vrai problème est celui de la modification du code. Que suggère la ligne de base des machines n'est pas vous aider à la façon dont vous avez réellement besoin.
Si vous utilisez un programme de transformation system (PTS), vous pouvez éviter beaucoup de ce non-sens.
Une bonne PTS va analyser le code source d'un AST, puis vous permettent d'appliquer au niveau de la source des règles de réécriture pour modifier l'AST, et enfin convertir la modification de l'AST en arrière dans le texte source. Génériquement PTSes accepter les règles de transformation de cette forme:
if you see *this*, replace it by *that*
[Un analyseur qui construit un AST n'est PAS un PTS. Ils ne permettent pas de règles comme cela, vous pouvez écrire un code ad hoc de pirater à l'arbre, mais ce n'est généralement assez maladroite. Ne font-ils de l'AST pour le texte de la source de régénération.]
(Mes PTS, voir bio, appelé) DMS est un dps qui pourrait répondre à cela. OP sur un exemple spécifique pourrait se faire facilement à l'aide de la règle de réécriture suivante:
source domain Python; -- tell DMS the syntax of pattern left hand sides
target domain Python; -- tell DMS the syntax of pattern right hand sides
rule replace_description(e: expression): statement -> statement =
" description = \e "
->
" description = ('line 1'
'line 2'
'line 3')";
Une règle de transformation est donné un nom replace_description pour le distinguer de tous les autres de la règle, nous pouvons définir. La règle de paramètres (e: l'expression) indiquer le motif de permettre une expression arbitraire tel que défini par la langue source. déclaration->déclaration signifie que la règle de cartes d'une instruction dans la langue source, à une instruction dans la langue cible; on pourrait utiliser n'importe quel autre syntaxe de la catégorie de l'Python grammaire fourni à DMS. La " utilisé ici est un metaquote, utilisé pour distinguer la syntaxe de la règle de forme de langage la syntaxe de l'objet langue. Le deuxième -> sépare le modèle de source de ce à partir de la mire qui.
Vous remarquerez qu'il n'est pas nécessaire de mentionner les numéros de ligne. Le PTS convertit la règle de la surface de la syntaxe correspondants ASTs en fait, l'analyse des modèles avec le même analyseur utilisé pour analyser le fichier source. L'ASTs produit pour les modèles sont utilisés pour effectuer la mise en correspondance du modèle/de remplacement. Parce que ce est entraîné à partir de l'ASTs, la mise en page de l'original du code (espacement, mais les sauts de ligne, commentaires) n'affectent pas DMS capacité de match ou de la remplacer. Les commentaires ne sont pas un problème pour la mise en correspondance parce qu'ils sont attachés aux nœuds de l'arborescence plutôt que de les nœuds de l'arborescence; ils sont conservés dans le programme transformé. DMS ne capture de ligne et de colonne précise de l'information pour tous de l'arbre des éléments; tout simplement pas nécessaires pour mettre en œuvre des transformations. La disposition du Code est également conservée dans la sortie par DMS, l'utilisation de la ligne/colonne d'informations.
D'autres PTSes offrent généralement des fonctionnalités similaires.