Was Sie wollen, ist eine massive Codeänderung Motor.
ANTLR wird nicht den Trick machen; ASTs sind notwendig, aber nicht ausreichend. Siehe meinen Aufsatz auf Life After Parsing. Eclipse "AST" kann besser sein, wenn das Eclipse-Paket einige Unterstützung für die Auflösung von Name und Typ bietet; Andernfalls werden Sie nie in der Lage sein, herauszufinden, wie Sie jedes "doSomething" ersetzen (möglicherweise überlastet oder lokal), es sei denn, Sie sind bereit, sie alle identisch zu ersetzen (und Sie können das wahrscheinlich nicht tun, weil einige Symbole verweisen zu Java-Bibliothekselementen).
Unsere DMS Software Reengineering Toolkit könnte verwendet werden, um Ihre Aufgabe zu erfüllen. DMS kann Java zu ASTs verarbeiten (einschließlich Kommentarerfassung), die ASTs auf beliebige Weise durchlaufen, ASTs analysieren und ändern und die modifizierten ASTs als gültigen Quellcode (einschließlich der Kommentare) exportieren.
Grundsätzlich möchten Sie alle Kommentare, Strings und Deklarationen von Bezeichnern auflisten, sie in eine externe "Datenbank" exportieren, um sie (manuell? Von Google Translate?) Auf ein Äquivalent zu mappen. In jedem Fall möchten Sie nicht nur das Element von Interesse, sondern seine genaue Position (Quelldatei, Zeile, gerade Spalte) notieren, da Elemente, die im Originaltext identisch geschrieben werden, im geänderten Text möglicherweise unterschiedliche Schreibweisen benötigen.
Enumeration von Strings ist ziemlich einfach, wenn Sie den AST haben; Durchsuchen Sie einfach den Baum und suchen Sie nach Baumknoten, die Zeichenfolgenliterale enthalten. (ANTLR und Eclipse können das sicher auch).
Enumeration von Kommentaren ist auch einfach, wenn der Parser Sie Kommentare erfasst hat. DMS tut es. Ich bin mir nicht ganz sicher, ob die Java-Grammatik von ANTLR oder die Eclipse-AST-Engine funktioniert. Ich vermute, dass sie beide fähig sind.
Enumeration von Deklarationen (Klassen, Methoden, Felder, Locals) ist relativ einfach; Es gibt mehr Fälle, über die Sie sich Gedanken machen müssen (z. B. anonyme Klassen mit Erweiterungen der Basisklassen). Sie können eine Prozedur codieren, um die AST zu durchlaufen und die Baumstrukturen anzupassen, aber hier ist der Ort, an dem DMS einen Unterschied macht: Sie können Oberflächen-Syntax-Muster schreiben, die wie der Quellcode aussehen, den Sie abgleichen möchten. Zum Beispiel:
pattern local_for_loop_index(i: IDENTIFIER, t: type, e: expression, e2: expression, e3:expression): for_loop_header
= "for (\t \i = \e,\e2,\e3)"
wird für Schleifenvariablen Erklärungen von lokalen übereinstimmen, und das Rückteilbäume für den Identifikator, der Typ und die verschiedenen Ausdrucksformen; Sie möchten nur den Bezeichner (und seinen Speicherort) erfassen, indem Sie einfach aus der Quellposition Informationen entnehmen, die DMS auf jedem Baumknoten speichert. Sie würden wahrscheinlich 10-20 solcher Muster benötigen, um die Fälle aller verschiedenen Arten von Identifikatoren abzudecken.
Erfassungsschritt abgeschlossen, etwas muss alle erfassten Entitäten in Ihre Zielsprache übersetzen. Das überlasse ich dir. Was übrig bleibt, ist, die übersetzten Entitäten zurück zu legen.
Der Schlüssel dazu ist die genaue Quellenposition. Eine Zeilennummer ist in der Praxis nicht gut genug; Sie können mehrere übersetzte Entitäten in der gleichen Zeile haben, im schlimmsten Fall einige mit unterschiedlichen Bereichen (stellen Sie sich zum Beispiel geschachtelt für Schleifen vor). Der Ersetzungsprozess für Kommentare, Strings und Deklarationen ist unkompliziert; Durchsuchen Sie den Baum erneut nach Knoten, die mit den identifizierten Positionen übereinstimmen, und ersetzen Sie die dort gefundene Entität durch ihre Übersetzung. (Sie können dies mit DMS und ANTLR tun. Ich denke Eclipse ADT erfordert, dass Sie einen "Patch" generieren, aber ich denke, das würde funktionieren.).
Der Spaß Teil kommt in der Ersetzung der Kennung verwendet.Dazu müssen Sie zwei Dinge wissen:
- für jede Verwendung einer Kennung, was ist die Erklärung zwecken; Wenn Sie das wissen, können Sie es durch den neuen Namen für die Deklaration ersetzen; DMS bietet vollständige Namen und Typ-Auflösung sowie eine Nutzungsliste, so dass dies ziemlich einfach ist, und
- Do benannte Bezeichner Schatten einander in Bereichen anders als die Originale? Dies ist im Allgemeinen schwieriger zu tun. Für die Java-Sprache haben wir jedoch eine "Shadowing" -Überprüfung, so dass Sie zumindest nach dem Umbenennen entscheiden können, dass Sie Probleme haben. (Es gibt sogar eine Umbenennung Prozedur, die verwendet werden können, solche Abschattung zu lösen Konflikte
Nachdem die Bäume Patchen Sie einfach den gepatchten Baum umschreiben wieder aus wie eine Quelldatei DMS eingebauten in Pretty verwenden. Ich denke, AST Eclipse kann schreibe seinen Baum plus Patches aus.Ich bin mir nicht sicher, ob ANTLR irgendwelche Möglichkeiten zur Neugenerierung von Quellcode von ASTs bietet, obwohl jemand möglicherweise einen für die Java-Grammatik codiert hat.Dies ist harder to do than it sounds, wegen all der wählerischen Details.YMM.
In Anbetracht Ihres Ziels bin ich ein wenig überrascht, dass Sie nicht möchten, dass eine Quelldatei "foo.java", die "class foo {...}" enthält, in .java umbenannt wird. Dazu müsste nicht nur der transformierte Baum geschrieben werden zu den übersetzten Dateiname (ziemlich einfach), aber vielleicht sogar den Verzeichnisbaum rekonstruieren (DMS bietet auch Möglichkeiten für Verzeichnisaufbau und Dateikopien).
Wenn Sie dies für viele Sprachen tun möchten, müssen Sie den Prozess einmal pro Sprache ausführen. Wenn Sie dies nur für Strings (den klassischen Fall der Internationalisierung) tun möchten, ersetzen Sie jede Zeichenfolge (die geändert werden muss, nicht alle) durch einen Aufruf eines Ressourcenzugriffs mit einer eindeutigen Ressourcen-ID. Eine Laufzeittabelle würde die verschiedenen Strings enthalten.
Verwenden Sie Property-Dateien. –
verweisen Sie hierzu auf http://stackoverflow.com/questions/1318347/how-to-use-java-property-files –
Das [Java Internationalisierungs-Lernprogramm] (http://docs.oracle.com/javase/tutorial/i18n/) index.html) ist ein guter Anfang. –