2014-06-05 5 views
2

J'ai modifié l'analyseur PLSQL donné par [Porcelli] (https://github.com/porcelli/plsql-parser). J'utilise cet analyseur pour analyser les fichiers PlSql. Après analyse réussie, j'imprime l'AST. Maintenant, je veux éditer l'AST et réimprimer la source originale de plsql avec l'information éditée. Comment puis-je atteindre cet objectif? Comment puis-je récupérer le fichier source d'AST avec les commentaires, les retours à la ligne et les espaces? En outre, le formatage doit également rester en tant que fichier d'origine. Toute initiative en ce sens serait utile.ANTLR: Générer le fichier source d'origine à partir de AST

+0

De nouvelles lignes/espaces et commentaires esthétiques seront perdus dans l'analyse; vous ne les récupérerez pas de l'AST seul. – Xophmeister

+0

@Xophmeister: il y a beaucoup de choses que vous ne pouvez pas récupérer d'un AST pur. Si vous voulez le récupérer, l'AST doit apporter des informations supplémentaires, qui peuvent être collectées lors de l'analyse. Vois ma réponse. –

Répondre

1

La réponse simple est "marcher dans l'arbre, et cracher le texte qui correspond aux nœuds". ANTLR offre « StringTemplates » comme une sorte de base de l'aide, mais il y a beaucoup de petits détails qui doit être abordée en fait: indentation, littéraux et leurs formats, commentaires, ...

Voir ma réponse sur SO Compiling an AST back to source code pour plus de détails. Une chose qui n'est pas abordée ici est le besoin général de reproduire le codage de caractères original du fichier (si vous le pouvez, vous ne pouvez pas, par exemple, avoir un fichier ASCII mais insérer une chaîne contenant un caractère Unicode).

1

Chaque nœud d'un AST est livré avec un membre d'index qui vous donne la position de jeton dans le flux d'entrée (flux de jetons en fait). Lorsque vous examinez les index dans votre AST, vous verrez que tous les index n'apparaissent pas (il y a des trous dans les index). Ce sont les positions qui ont été filtrées (généralement les espaces et les commentaires). Votre flux d'entrée est cependant capable de vous donner un jeton à un index donné et, important, de vous donner chaque jeton trouvé, quel que soit le canal dans lequel il se trouve. Donc, votre stratégie pourrait être de parcourir les jetons depuis votre flux de jeton et imprimez-les au fur et à mesure. En outre, vous pouvez inspecter votre AST pour l'index actuel et voir si à la place, une sortie différente doit être générée ou une sortie supplémentaire doit être ajoutée.

+0

La question est "Comment imprimer la source de l'AST". Vous dites, "itérer sur les jetons ..."; OP suppose raisonnablement que ceux-ci ont disparu. –

+1

@IraBaxter L'OP veut régénérer le code source original + quelques modifications ajoutées à l'AST. Lire entre les lignes. Eh bien, c'est tellement évident, vous n'avez pas besoin de lire entre les lignes en fait ... –

Questions connexes