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



## Celeborn (11. Jan 2009)

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 (11. Jan 2009)

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 (12. Jan 2009)

<<< Celeborn



			
				Wildcard hat gesagt.:
			
		

> Celeborn hat gesagt.:
> 
> 
> 
> ...



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


----------



## Wildcard (12. Jan 2009)

Dann ist OpenArchitectureWare wohl das richtige für dich.


----------



## SvenK (13. Jan 2009)

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:

```
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.


----------



## Wildcard (13. Jan 2009)

Bei Python wird das ebenfalls so gemacht. Hier eine AntLR Grammatik dafür, die dir wohl als Beispiel dienen kann.
http://www.antlr.org/grammar/1200715779785/Python.g


----------

