AST (Abstract Syntax Tree)-Generierung für Eclipse-Plugin

Status
Nicht offen für weitere Antworten.
C

Celeborn

Gast
Grüße zusammen!!

Vorgeschichte: bei uns in der Firma nutzen wir für ein Legacy-System eine, nett ausgedrückt, angestaubte Programmiersprache/-umgebung (Gupta bzw. Centura, wenn das jemandem was sagt), deren eigene IDE nicht wirklich schön zu bedienen ist. Also habe ich ein Projekt gestartet, um ein entsprechendes Eclipse-Plugin zu erstellen. Das hat auch bisher sehr gut funktioniert, sprich Syntaxhighlighting, Outline und Autovervollständigung für Sprachelemente machen in etwa das, was sie sollen. Das Ding ist auch schon im Produktiveinsatz.

Alle Elemente, also Parser, Codescanner, Outlineview und CompletionProcessor wurden mehr oder weniger von Hand erstellt und mit Daten versorgt, was nicht immer wirklich elegant aussieht, aber zumindest funktioniert.

In der nächsten Ausbaustufe sollen nun aber die wirklich interessanten Dinge eingebaut werden: allen voran Refactoring, Autovervollständigung für Projektelemente (eigene Klassen, Funktionen, Variablen), Annotations (das farbige Rechteck hinter jedem Vorkommen eines Elements), eben all das was man auch vom JDT kennt.


Dafür brauchen wir aber eine Repräsentation des Projekts, mit allen Elementen und deren Vorkommen in allen Quelltextdateien, sprich einen AST (Abstract Syntax Tree). Nun kommt meine Frage, wie man das am besten anstellt.
Ich habe mich mit Thema schon etwas befasst, was Theorie und verfügbare Tools betrifft, bräuchte nun aber noch etwas Entscheidungshilfe.

Zum einem gibt es da die nicht-eclipsoiden Parser-Generatoren wie JavaCC und ANTLR, die ja genau das bieten was wir brauchen, eben aus einer Grammatik einen Parser, Lexer usw zu generieren. Oder eben das Eclipse Modeling Project mit seinen vielen Tools, die einem solche Dinge wie Outline und Codevervollständigung größtenteils abnehmen. Nur ist das letztere ja hauptsächlich für DSLs gedacht. Aber kann ich meine Quellsprache (Centura/Gupta) nicht auch als DSL betrachten? Ich denke schon.

Meine Frage ist also, wer kann mir erst einmal bei meiner Technologie-Entscheidung weiterhelfen und mir weiterführende Tipps geben. Vielleicht sind unter euch ja erfahrene Plugin-Entwickler, die an änhlichen Projekten arbeiten.


Schönen Tag noch
 

Wildcard

Top Contributor
Celeborn hat gesagt.:
Aber kann ich meine Quellsprache (Centura/Gupta) nicht auch als DSL betrachten? Ich denke schon.
Sehe ich auch so. Wenn du also (warum auch immer) alles neu aufsetzen willst, riskiere einen Blick auf EMF + OpenArchitectureWare.
Wenn du mit deiner Outline, Completion,... zufrieden bist, kannst du den Rest auch mit konventionellen Tools wie eben ANTLR erledigen.
Aber: wie fütterst du überhaupt deine Outline wenn du gar keinen AST hast? ???:L
 

SvenK

Aktives Mitglied
<<< Celeborn

Wildcard hat gesagt.:
Celeborn hat gesagt.:
Aber kann ich meine Quellsprache (Centura/Gupta) nicht auch als DSL betrachten? Ich denke schon.
Sehe ich auch so. Wenn du also (warum auch immer) alles neu aufsetzen willst, riskiere einen Blick auf EMF + OpenArchitectureWare.
Wenn du mit deiner Outline, Completion,... zufrieden bist, kannst du den Rest auch mit konventionellen Tools wie eben ANTLR erledigen.

Wenn mir das EMF schon solche Sachen wie Outline, Completion etc. größtenteils abnimmt, um so besser. Ich möchte weg von dem selbstgeschriebenen Code. Denn ich habe nichts dagegen, Frameworks einzusetzen, wo sie sinnvoll sind, so wie manche hier im Forum ;)

Wildcard hat gesagt.:
Aber: wie fütterst du überhaupt deine Outline wenn du gar keinen AST hast? ???:L

Das Plugin hat natürlich schon ein Modell, auf dem man auch leidlich suchen kann. Aber das ganze ist zu fehleranfällig und muss bei jedem neuen Sprachfeature angefasst und geändert werden. Ich möchte mich wirklich nur noch um die Grammatik kümmern müssen, den Rest sollen andere machen ;)
 

SvenK

Aktives Mitglied
Gibt es denn auch jemanden hier, der sich Grammatiken im allgemeinen und denen von OpenArchitectureWare (XText) im speziellen auskennt?

Denn mein Problem ist, ob und wie man die Strukturen nicht anhand von Begrenzern definiert (zBsp. werden Blöcke in Java durch { ... } begrenzt), sondern anhand von anderen Kritierien wie die Einrückung der Codezeile.

Kleines Beispiel zum Verständniss:
Code:
Function: NotifyEdit
	Description: 
	Returns
	Parameters
	Static Variables
	Local variables
	Actions
		Call SalSendMsg(..WindowHandle(), PAM_SortChange, 0, 0)
In dem Beispiel gehören alle Zeilen, die weiter eingerückt sind als "Function: NotifyEdit" zu eben dieser Funktion und die Zeile "Call SalSendMsg(..WindowHandle(), PAM_SortChange, 0, 0)" gehört zum Block "Actions"

Dies müsste ich grammatikalisch abbilden, habe so etwas aber bisher nirgends als Beispiel gefunden.

Wäre über Tipps und/oder weiterführende Links dankbar.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben