Home

Dokument_1

image

Contents

1. 9 4 ANTLR 12 Ser H GC A E RN 12 4 2 Funktionsweise von ANTLR 13 4 2 1 Javagrammatik f r ANTLR 13 4 9 N tige Anpassungen x nos amp a la dan AAA A al de dee 14 4 3 1 Anpassung Position des Tokens als Offset 14 4 3 2 Anpassung Position des Tokens im AST verf gbar 16 4 3 3 Anpassungen zum Aufnehmen der Kommentare in den 17 4 3 4 Fehlende Quelltextelemente 18 5 Metamodell f r Java 5 19 SI Besrittsdehinitionen a sissi as AAA Aa Rd 19 5 2 Anforderungen an das 19 5 3 Metamodell von Hinterw ller 20 5 4 Eigenes Metamodell f r Java 5 20 5 4 1 Grundlegende Knoten und Kantentypen im Metamodell 21 A O die an ae ee OE ee 22 34 3 Kantentypen e 445 3 494 Bbc dos eee eS RE 22 6 Entwurf 24 61 Package yayaextract f ss A REOR Ey 6 ko RR 24 6 2 Package javaextractor adapters 25 6 3 Package yavaextractor comments 21 6 4 Package javaextractor factories 28 6 5 Package javaextractor resolvers 29 6 6 Package javaextractorschema 30 6 7 Package javaextractor schema impl 30 7 Funktionsweise des Javaextraktors 32 Inhaltsverzeich
2. 6 5 uoisseJdxa3jouonipuoas JO4eure3uo5pou3els PIeiipesse vjouoneadepeqs I I I I T I I I I 1 I e I sed uone oAu poyn edA3 g ise5ssep seou ning uoisseJdxgjeuonipuo uone oAu poyn uorssardxz Metamodell Teil 10 12 Abbildung 17 57 A Metamodell der Graphklassen Joe2uejsul lt lt lt lt lt gt gt 06 cya ta 9 e e sJ03e49doxinsod mV mi o l s S jq ssod jq ssod SJ03eJedoxyul lqissod Ju u1 2 S e uoissaJdx3 e T I I uoissaJdx3xyu gO9pISpueH3eTs I uoisseJ4dx3xuiso ISpuel s z enlu IS 1 3xy1sodjO9SpISpueH3eTs uoisseudxaxiju goepispuernubris 30 321 uoisseJdx3xieadjoepispueH1iubrs I T T T SsJo3euedoxinsod Jojeledo a sJojejedOxyeJd Jojeledo o s oyessdoxyuj uolss udxax nsoq uoisse1dxaxyoad uoisse1dx3xyu uojsseudx3 Ey E s p s un JO uoneulquuo e Jo euou 30UUO 1 anq JO3u21u0DSl Ho sazdxq AYOW MO JNO 40 JO ZISSI INO aney Aew Jezi eniu Ae Jay uv TO JO1u931u05S JOsziss T I sed Ajuone o u poujsw edA a uone oau poyn 2 uoge2yr edsedA E Jezijeniu euy uoge2yr edsedA E t T D ER efqojoed Isi eJigp
3. JOJ9QUISIAS T poa E D D D 26 T JOuoneoJ2pI9tHs Dia Abbildung 12 Metamodell Teil 5 12 52 Bugs sweu O spy1pow d n uorsseudx3 Ey Jeynuep 6 uogeoypedsedA C Jay pon T I I JOeuieNpIer4uone3ouuys pieid oneyouuyjOJeHIpops JoenjeAimnejeqsT pieijuonejouuyjoed A Isi I I pieiguoneyouuy Bus eureu O Sus aureu O pola uorsseudx3 Ey Jeynuep uone3ouuy I m 1 T ue suopwnugjzo uawnbys JO poigiueysuo2uinuss 1ue1suo5 unu3jOuonej1ouuygs JOSureN1uejsuoJuinuzs I I T I queysuojuinug no T POYISIAJO POSS uonuyagpoyien Suns eureu o Sali d o Jeynuep C Jeyipojy I T To Jo3ouieuedjOed s JO9UIeNJo39UreJeds ABJOWILILGJOISIJIPOWS T T T Suns aueu n SIBYIPON d a uomge ymedsedA o uone eyp qs ule led 19 4 unu pi o e J IJIPOWN e 1 pa POUYI9INJOA9PUILIEAS JOJe3eur amp aeged A s PAR RI gt gene POLYSWJOHSLHPOWS POYPW gUMOAyLUONda gt X3S poyyWsoowens 5 uonesep qpou r Metamodell Teil 6 12 Abbildung 13 53 A Metamodell der Graphklassen Buijs aueu a Joynusp TO jo be j onunuo5s enunuo Buijs sweu a Jeynuep TO Jobe pjee
4. l int x value atom STAR x atom value x x x atom returns int value l 1 INT value Integer parselnt 1 getText 151 E Detaillierte Funktionsweise von ANTLR LPAREN value expr RPAREN Listing 43 Auswertung des Ausdrucks mit semantische Aktionen in der Parsergrammatik Die erste Regel gibt das Ergebnis einer Addition oder Subtrakion zuriick Dazu wird die linke Seite der Regel um das Ausgabeargument returns int value 0 und die semantische Aktion int x erweitert Diese deklariert eine lokale Variable die dazu dient die rechten Operanden der jeweiligen arithmetischen Operation mit x mexpr aufzunehmen Die linken Operanden werden im Ausgabeargument value aufgenommen Die Auswertung erfolgt schlieBlich ber die semantischen Aktionen value x wenn eine Addition erkannt und value x wenn eine Subtraktion erkannt wird Um das Ergebnis auszugeben muss die Klasse Main noch um die in Listing 44 aufgef hrten Zeilen erg nzt werden int x parser expr statt nur parser expr System out printlin x Listing 44 Angepasste Main Klasse f r Auswertung mittels semantischer Aktionen Die Eingabe von 3 4x5 f hrt dann zur Ausgabe des Ergebnisses von 23 Wie oben bereits angef hrt K nnen auch in der Lexergrammatik semantische Aktionen defi niert werden Zwar ist dort jede Auspr gung von Javaquelltexten erlaubt jedoch ist dar ber im Allgemeinen nur die Steuerung des Lexers wie
5. Es gelang uns zwar eine Javaklasse zu schreiben die einen Javaquelltext an den Parser wei terreicht und den Parsingvorgang wie in der JavaCC Dokumentation beschrieben anst sst Allerdings bekamen wir vom Parser keine R ckmeldung So ist uns nicht klar ob der Parsing vorgang berhaupt begann und ob dieser erfolgreich war Parsingtests Die zugrundeliegende Grammatik stammt vom Juni 2003 ist also lteren Datums als die endg ltige Fassung von Java 5 Unsere bisherigen Erfahrungen haben jedoch gezeigt dass dies nicht von Vorteil f r die Erkennungsrate der Parser ist Leider mussten die Parsingtests aber entfallen da es uns nicht gelang dem Parser eine brauchbare R ckmeldung zu entlocken Rechercheergebnis jn ooo o o Parser in Java Tabelle 19 bersicht JRefactory C 3 3 FUJABA Eine kurze bersicht zu den wichtigsten Daten von FUJABA findet sich in Tabelle 20 105 C Dokumentation der Onlinerecherche Historie FUJABA steht f r From UML to Java and back again und wurde 1997 von Tomas Klein Ulrich Nickel J rg Niere und Albert Z ndorf an der Universit t Paderborn ent wickelt Seitdem unterliegt es einer st ndigen Weiterentwicklung Die aktuelle Version stammt vom M rz 2005 allerdings ist f r M rz 2006 schon die n chste Version angek ndigt FUJABA ist Public Domain und die Quelltexte sind frei verf gbar Charakterisierung Die FUJABA Tool Suite stellt Werkzeuge zur Verf gung die aus UML Diagr
6. VertexClass JavaPackage fullyQualifiedName String VertexClass PackageDefinition ExternalDeclaration EdgeClass IsPackageNameOf AttributedEdge from QualifiedName 1 1 to PackageDefinition 1 EdgeClass IsPartOf from TranslationUnit 0 x to JavaPackage 1 1 EdgeClass IsPackageOf from JavaPackage 1 x to Program 1 1 EdgeClass IsSubPackageOf from JavaPackage 1 to JavaPackage 1 1 VertexClass Comment VertexClass SingleLineComment Comment VertexClass MultiLineComment Comment VertexClass JavaDocComment Comment EdgeClass IsCommentin AttributedEdge from Comment to TranslationUnit 1 1 5 EdgeClass 5 AttributedEdge from QualifiedNamer 1 1 to Annotation 1 1 EdgeClass IsAnnotationArgumentOf AttributedEdge from Expression to Annotation 1 1 EdgeClass IsAnnotationOfPackage IsAnnotationOf from Annotation to PackageDefinition 1 1 EdgeClass IsStatementOfBody sStatementOf from Statement to Block 1 1 EdgeClass IsTypeln AttributedEdge from Type x to Statement 1 1 VertexClass SimpleArgument VertexClass WildcardArgument EdgeClass IsSimpleArgumentOf IsArgumentOf from SimpleArgument to TypeArgument 1 1 76 541 EdgeClass IsWildcardArgumentOf IsArgumentOf from WildcardArgument to TypeArgument 1 1 155 s EdgeClass IsTypeOfSimpleArgume
7. bergibt den Pfad einer zu parsenden Datei oder eines Verzeichnisses Dieser Parameter muss mindestens einmal und kann beliebig oft vorhanden sein out DATEINAME oder o DATEINAME bergibt den Pfad zur Datei in die der erzeugte TGraph gespeichert wird Die Datei sollte die Endung tg besitzen Dieser Parameter ist optional standardm ig wird die Datei extractedgraph tg im ak tuellen Verzeichnis verwendet name PROGRAMMNAME oder n PROGRAMMNAME bergibt den Namen welcher im erzeugten TGraph als Programmname gesetzt wird Dieser Parameter ist optional log DATEINAME oder 1 DATEINAME bergibt den Pfad zur Datei in die das Log geschrieben wird Dieser Parameter ist optional standardm ig wird die Datei javaextractor log im aktuellen Verzeichnis verwendet eager oder e F hrt den Extraktor im EAGER Modus aus Dieser Parameter ist optional Standard ist der LAZY Modus complete oder c F hrt den Extraktor im COMPLETE Modus aus Dieser Para meter ist optional Standard ist der LAZ Y Modus Zu beachten ist au erdem dass beim Parsen einer gr eren Menge Quelltext der Heap ber laufen kann Dies l sst sich verhindern indem Java ber den Kommandozeilenparameter Xmx ein h herer Maximalwert f r den Heap zugewiesen wird Ein konkreter Aufruf des Extraktors mit einer maximalen Heapgr e von 768MB und unter Verwendung aller o g Kommandozeilenparameter sieht wie folgt aus 44 java Xmx768M javaextracto
8. class MyLexer extends Lexer Listing 19 Definition und somit Beginn einer Lexergrammatik class OtherLexer extends Lexer antlr debug DebuggingCharScanner Listing 20 Benutzung eines anderen Lexers Alle nun folgenden Abschnitte mit Ausnahme des Abschnittes der Regeln werden in ge schweiften Klammern eingefasst 136 F 1 Grundlagen Header Im Header kann eigener Quelltext definiert werden der in die zu erzeugenden Klassen aufgenommen werden soll unmittelbar nach der Klassendefinition Dieser spielt meist nur f r C basierte Parser eine Rolle da in dieser Sprache Elemente erst deklariert werden m ssen bevor diese referenziert werden d rfen wie in Listing 21 String message ein Zeiger auf einen String Listing 21 M gliche Verwendung f r einen Header Optionen Inden Optionen werden abschnittsspezifische Einstellungen vorgenommen Ab schnittsspezifisch da Optionen von Datei ber Grammatik bis zu Regel und Tokenebene hinab gesetzt werden k nnen In den von uns benutzten Grammatiken wurden Optionen aller dings nur auf Grammatik und Regelebene gesetzt Ein kurzes Beispiel ist n den Listings 22 und 23 zu sehen Eine komplette Aufstellung aller Optionen befindet s ch auf der Hompepage von ANTLR unter 16 options exportVocab MyVocabulary Name des Tokenvokabulars j Listing 22 Optionsabschnitt einer Lexergrammatik options k 2 Gr e des Lookaheads buildAST tru
9. 141 142 143 144 145 146 147 148 149 E2 Javagrammatik aus ANTLR modifiers modifier annotation modifier 7 private public protected static transient final abstract native threadsafe synchronized volatile strictfp annotation 1 identifier annotationArguments annotations annotation annotationArguments ee annotationMemberValuelnitial zer anntotationMemberValuePairs anntotationMemberValuePairs annotationMemberValuePair annotationMemberValuePair annotationMemberValuePair E IDENT annotationMemberValuelnitializer annotationMemberValuelnitializer 169 F Entwicklung eines neuen Metamodells 151 conditionalExpression annotation annotationMemberArrayInitializer 152 153 i4 annotationMemberArraylnitializer 155 aS udo 156 annotationMemberArrayValuelnitial zer 157 annotationMemberArrayValuelnitializer 158 m 159 160 a 161 162 is annotationMemberArrayValueInitializer 164 conditionalExpression 165 annotation 166 2 167 ws superClassClause 169 extends classOrInterfaceType 170 S 171 im classDefinition 173 5 class IDENT 174 typeParameters 175 superClassClause 176 implementsClause 177 classBlock 178 3 179 iso 1nterfaceDefinition 181 interface IDENT 182 typeParameters 183 interfaceExtends 184 inter
10. parameterModifier compoundStatement statement annotation final 1 annotation 1 1 statement compoundStatement declaration expression 175 F Entwicklung eines neuen Metamodells 402 modifiers classDefinition 403 IDENT statement 404 if expression statement else Statement 405 forStatement 406 while expression statement 407 do statement while expression break IDENT 410 return expression 409 continue IDENT 411 switch expression casesGroup p 412 tryBlock 413 throw expression 414 synchronized expression compoundStatement 415 assert expression expression 416 417 418 49 forStatement 420 for traditionalForClause forEachClause statement 421 422 a3 traditionalForClause 424 Dp forlnit forCond forlter 425 426 a7 forEachClause 428 5 parameterDeclaration expression 429 gt 430 41 casesGroup 432 we aCase aCase caseSList 433 2 434 5s alase 436 nE case expression default 437 438 caseS List 440 statement 441 442 176 443 444 445 446 447 448 449 451 452 453 454 455 457 458 459 461 462 463 464 466 467 468 469 470 471 472 473 47
11. 10 Nn 10 ON 10 10 oo 10 110 EdgeClass IsTypeArgumentOfTypeSpecification AttributedEdge from TypeArgument 0 to TypeSpecification 1 1 11 112 VertexClass Program name String VertexClass TranslationUnit EdgeClass IsTranslationUnitin from TranslationUnit x to Program 1 1 abstract VertexClass FoldGraphReference lengthOfFile Integer 11 11 P 11 11 ON 75 B Schema der Graphklassen 117 VertexClass SourceUsage FoldGraphReference 11 oo 11 12 12 E 122 12 o 12 ER 125 12 ON 127 12 oo 129 130 13 E 13 N 13 LA 13 E 13 Nn 136 137 13 oo 13 140 14 142 14 LA P RB E ON P oo E EdgeClass IsSourceUsageln from SourceUsage 1 1 to TranslationUnit 1 1 VertexClass SourceFile name String EdgeClass IsPrimarySourceFor from SourceFile 1 1 to TranslationUnit 1 1 EdgeClass IsSourceFor from SourceFile 1 1 to SourceUsaget 1 1 abstract VertexClass ExternalDeclaration EdgeClass IsExternalDeclarationin AttributedEdge from ExternalDeclaration x to SourceUsaget 1 1 abstract VertexClass ImportDefinition ExternalDeclaration VertexClass ClassImportDefinition ImportDefinition VertexClass PackagelmportDefinition ImportDefinition
12. TranslationUnit eine geparste Datei ist als Knoten diesen Typs im TGraph ver treten Ist durch eine Kante vom Typ IsTranslationUnitOf mit Program ver bunden e SourceFile repr sentiert den Ort einer geparsten Datei und ist durch eine Kante vom Typ IsPrimarySourceFor mit TranslationUnit verbunden e SourceUsage repr sentiert ebenfalls eine geparste Datei und ist durch eine Kante vom Typ IsSourceUsageOf mit TranslationUnit verbunden ExternalDeclaration jeder Knotentyp der eine Package Import oder Typ definition repr sentiert ist von diesem Typ abgeleitet und durch eine Kante vom Typ IsExternalDeclarationIn mit SourceUsage verbunden Der n chste Abschnitt geht auf Knotentypen ein die Javasprachkonstrukte repr sentieren 21 5 Metamodell f r Java 5 5 4 2 Knotentypen Das Metamodell enth lt Knotentypen f r alle Sprachkonstrukte bis Java Version 5 An dieser Stelle soll nur auf die Hauptgruppen und nicht auf jeden einzelnen der Knotentypen eingegan gen werden Alle im Metamodell definierten Knotentypen basieren auf einer der folgenden Klassen als Basistyp1 e Type Knotentypen die von diesem abgeleitet sind repr sentieren Klassen Interface Enum und Annotationsdefinitionen sowie Typparameterdeklarationen e TypeSpecification Knotentypen die von diesem abgeleitet sind repr sentieren Typspezifikationen durch Klassen primitive Typen Arrays und Typargumente e Member Knotentypen die von diesem abge
13. e li it z E jJoaweno exp gt eds TI E Jebe3u al4jou bus O a2ueJaJayude4opjo4 E u juongae eg euJe3x3s i I Besn unos 10 Joebex edqnss I I u besn nossi I Sus a T a eypegene E t JOMedsI x I zk Joebe oeqs Aunuopejsueu C u umuonejsuea s I Suns aueu n welbold E uoniugequodui beed E uoniugequodui eet E T JO9d payoduu is uonuyeguodun Bugs aueu n I 40Jo2unoss T 3ueuiuo52oqene f E jueunuoj5eur1niniy E 404924noS ueuiuds u BUSWWOJS Abbildung 8 Metamodell Teil 1 12 48 Suns aueu n 12019 e uomne ymedsoedA E uoneaepoeguae3eureaeded L e Joynuep e T E I 398J49JU Josseppjednss yQaweNsoeyieq 5 Oy1PoOWS Jo poige epuie1u 5 151 I I T ueo oog a Duis eueNpeyienoAling a Buijs aueu n edA s ay poyy d a 1yipon Buijs aueu n 12019 6 uoje2ymoedsedA e uoneae eque13euuedeqed r E Joynuoep ep T T TO z JOPIO ASSEIDS ssej9 0ssejJ4adnss JOSUENSSe
14. gramm so gruppiert dass sie sich wie der Quelltext von Links nach Rechts lesen lassen Beispielsweise deckt das Modell aus Abbildung 52 die syntaktischen Konstruktionen aus Lis ting 49 ab MyClass lt T x MyClass T extends String MyClass T super YourClass gt Listing 49 Beispiele f r die drei erlaubten syntaktischen Konstruktionen rotmarkiert einer TypeParameterDeclaration F 1 6 Designentscheidungen Vereinheitlichung Ziel der Designentscheidungen war es neben der weiteren Vereinfa chung des Modells auch eine Vereinheitlichung der Strukturen zu erreichen die das Ver st ndnis beim Arbeiten mit den TGraph Instanzen f rdern soll Vereinheitlichungen nahmen wir vor mit 164 EI Vorgehensweise e Aufhebung der Unterscheidung der R mpfe von Class Interface Enumeration und Annotation So war eine Zusammenfassung der m glichen Inhalte eines Block m glich und das Metamodell wurde erheblich kompakter e Nichtunterscheidung des Destructors da dieser nur eine speziell benannte Methode ist und einfach ber seinen Namen finalize 1dentifiziert werden kann e Einf hrung von QualifiedName analog zu bereits bestehendem QualifiedType So k nnen diese z B bei GreQL Anfragen auch auf die gleiche Weise behandelt wer den Eindeutig unterschieden haben wir dagegen Deklarationen und Definitionen von Fields loka len Variablen und Methoden da in Java nicht generell Deklaration und Definitio
15. u In 15 26 prohibits assignments to parenthesized 2 variables but earlier in 15 8 5 it states that a 23 Ai parenthesized variable is still a variable in JLS1 a Al parenthesized variable was a value and the intent of s assignment is that a variable appear on the left hand 26 Side Also the grammar in chapter 18 if you can call x it such because of its numerous typos and ambiguities si permits assignment to parenthesized variables l void m int i 30 1 x sl 32 array access of an initialized array creation is legal 3 see Sun bugs 4091602 4321177 34 developer fava sun com developer bugParade bugs 4091602 himl 3 developer fava sun com developer bugParade bugs 4321177 himl sel Eric Blake says 3 Again the body of the JLS prohibits this but chapter 18 38 permits it Int new inti 10H01 4o intj new charll O K length 41 42 plain identifiers can qualify instance creation and a explicit constructors see Sun bug 4750181 44 developer java sun com developer bugParade bugs 4750181 html as Ai Eric Blake says 4 Sun admits the grammars between the earlier chapters and a Ai chapter 18 are incompatible so they are not sure whether asi things like identifier new name should be legal or Ai not Chapter 18 treats identifiers as primaries and javac so 7 compiles them s class B 52 B b s Void foo Eri
16. 0 to ConstructorDefinition 1 1 o EdgeClass IsBodyOfConstructor AttributedEdge from Block 1 1 to ConstructorDefinition 1 1 N N N Uy 302 o VertexClass StaticlnitializerDefinition Member 304 EdgeClass IsBodyOfStaticlnitializer AttributedEdge from Block 1 1 to StatielnitializerDefinition 1 1 305 36 VertexClass StaticConstructorDefinition Member 307 EdgeClass IsBodyOfStaticConstructor AttributedEdge from Block 1 1 to StaticConstructorDefinition 1 1 308 l o2 LA b 323 Schema der Graphklassen EdgeClass IsModifierOfMethod IsModifierOf from Modifier to MethodDeclaration L EdgeClass IsReturnTypeOf sTypeOf from TypeSpecification 1 1 to MethodDeclaration 1 1 EdgeClass IsTypeParameterOfMethod IsTypeParameterOf from TypeParameterDeclaration to MethodDeclaration 1 1 EdgeClass IsNameOfMethod AttributedEdge from Identifier 1 1 to MethodDeclaration 1 1 EdgeClass IsParameterOfMethod IsParameterOf from ParameterDeclaration to MethodDeclaration 1 1 EdgeClass IsExceptionThrownByMethod IsExceptionThrownBy from TypeSpecification 0 x to MethoaDeclaration 1 1 VertexClass MethodDefinition MethodDeclaration EdgeClass IsBodyOfMethod AttributedEdge from Block 1 1 to MethodDefinition 1 1 E EdgeClass IsModi
17. 1 to Variablelnitializer 1 1 282 23 EdgeClass IsAnnotationOfMember IsAnnotationOf from Annotation x to Member docs 24 EdgeClass IsMemberOf AttributedEdge from Member to Block 1 1 285 26 VertexClass Field Member el EdgeClass IsFieldCreationOf AttributedEdge from Statement 1 1 to Field 1 1 288 29 VertexClass AnnotationField Member 20 EdgeClass IsModifierOfAnnotationField IsModifierOf from Modifier x to AnnotationField 1 1 201 EdgeClass IsTypeOfAnnotationField AttributedEdge from TypeSpecification 1 1 to AnnotationField 1 1 202 EdgeClass IsAnnotationFieldNameOf AttributedEdge from Identifier 1 1 to AnnotationField 1 1 23 EdgeClass IsDefaultValueOf AttributedEdge from Expression 1 1 to AnnotationField 1 1 N 294 25 VertexClass ConstructorDefinition Member 26 EdgeClass IsModifierOfConstructor IsModifierOf from Modifier to ConstructorDefinition 1 1 EdgeClass Is TypeParameterOfConstructor IsTypeParameterOf from TypeParameterDeclaration x to ConstructorDefinition 1 1 ss EdgeClass IsNameOfConstructor AttributedEdge from Identifier 1 1 to ConstructorDefinition 1 1 EdgeClass IsParameterOfConstructor lsParameterOf from ParameterDeclaration to ConstructorDefinition 1 1 320 EdgeClass IsException ThrownByConstructor IsExceptionThrownBy from TypeSpecification
18. 30 H 31 times 32 33 double eval double x double y 34 35 return x x y 36 A 1 38 divided by 40 double eval double x double y 41 42 return x y 43 44 u as Perform arithmetic operation represented by this constant 47 abstract double eval double x double y 48 49 public static void main String args 50 51 double x Double parseDouble args 0 52 double y Double parseDouble args 1 53 4 122 C 7 Javaquelltexte f r Tests ss Listing 11 AbstractEnumShouldGiveParseError java il rz j x Diese Klasse kombiniert die Modifier abstract und final l x welche sich gegenseitig ausschliessen al x Erzeugt beim Kompilieren mit javac folgenden Fehler s x public abstract final void someAbstractMethod 9 x 4 1 error 111 pl x 3 import java io x is public abstract class AbstractFinalShouldGiveParseError vn public abstract final void someAbstractMethod Listing 12 AbstractFinalShouldGiveParseError java il 2 x Diese Klasse nutzt ein for each in Konstrukt welches 3 x in den Previews zu Java 5 Tiger noch unterstuetzt wurde es al x allerdings nicht in die endgueltige Fassung geschafft hat s x Erzeugt beim Kompilieren mit javac folgenden Fehler 6 1 x ForEachInShouldGiveParseError java 13 expected si x for each int iall in iaa 9 A x ForEachInShouldGiveParseError java 20 i x Illegal start of expression nx
19. Auch die Erzeugung der Parser aus den Java Grammatiken gelang zun chst erfolgreich Al lerdings ist auch in diesem Fall nicht beschrieben wie diese Parser einzusetzen sind Aus dem zu den Java Grammatiken mitgelieferten Lexer und Codeger st welches eine Ausf hrung der Parser erm glichen soll konnten wir nach vielem Ausprobieren und nochmaliger Erzeugung der Parser herleiten wie diese zu benutzen sind Nachdem wir in den Quelltexten zus tzlich noch einige imports erg nzt hatten konnten wir die Parser endlich testen Danach gelang auch die Integration des Parsers 1n ein Eclipse Projekt Da der Parser zur Lauf zeit Komponenten von CUP ben tigt haben wir die Laufzeitumgebung von CUP in ein JAR gepackt und in das Eclipseprojekt importiert Position amp L nge der Tokens im Quelltext Zu diesem Thema schweigt sich die Doku mentation von CUP aus ist dies doch eher Aufgabe des eingesetzten Lexers Der mitgelieferte Beispiellexer bietet daf r aber keine Funktionali ten Parsingtests Das Parsen der fehlerfreien Quelltexte absolviert der Parser ohne Fehl und Tadel Dies ist allerdings nicht weiter verwunderlich da ein Teil der Testquelltexte aus CUP entnommen wurden Allerdings erkennt dieser keinen einzigen Fehler in den fehlerhaften Quelltexten Auch Fo rEachInShouldGiveParseError java verarbeitet der Parser ohne Kommentar Der Grund daf r ist dass die Javagrammatik f r CUP nicht der finalen Java Version 5 entstammt sondern au
20. JoedAis E 30201951 JO13uaurgejss E JO4ejoureieqs 5 JoJey pows CH Joel ULUNJOI au Joba1u u36us 0 OF 0 uu Joba1u 3 sHO Abbildung 22 Kantentypenhierarchie Teil 3 13 62 ejgeueAouonejyouuys CH d youopejouuys 5 3ueysuo umnugjouonejouuys 5 eBexypedjouonezouuys Jouogejouuys jouoneyouuyeyeuis E Jequiejyjouone3ouuys 5 Abbildung 23 Kantentypenhierarchie Teil 4 13 63 A Metamodell der Graphklassen JOJUSUINBIYUMSS CH jo1ueuin amp uypae prws 1 JO3ueuinfuyejduuiss e Joieun amp uys 3ue1suo3uunu3jO1ueuunfauys e Abbildung 24 Kantentypenhierarchie Teil 5 13 64 Jouonipuopese5s E jouonipuo2Jogs 6 6 E 251 Ey uoisseudxajouonipuo5s yuouonupuoosi n ssyyouonipuo osi E Abbildung 25 Kantentypenhierarchie Teil 6 13 65 A Metamodell der Graphklassen unu3joe eyiagu isi 2 sseppjosepaqu is E 1 6 yossep dnss E ssepojossejpuadnss 2 Jossepednss Ey POYIOW gUMOAyLUONda gt X3Ss e 4032nu3suo5AguMouu j uonde xas CN Agumo41uondo x3s Ey 403on3suo2onexsjo pogs 6 JoApog ojonasuojs 6 Ab
21. L nge der Tokens im Quelltext Aus der Schnittstellenbeschreibung des Lexers im Benutzerhandbuch geht hervor dass zu jedem Token der String somit die L nge und die Position im Quelltexte abgefragt werden kann Auch hier m sste in jedem Knosten des AST eine Referenz zum Ursprungsknoten gehalten werden 94 C 2 Parsergeneratoren Parsingtests Das Parsen der fehlerfreien Quelltexte f hrt zum Grofteil zum erwarteten Ergebnis da der Parser nicht mit Java 5 Konstrukten umgehen kann Statische Imports die neuen for Ausdr cke und Generics sind ihm einfach nicht bekannt Nur die Klasse Eric wird fehlerfrei geparst da diese nur Ausdr cke enth lt die schon in Java Version 1 4 erlaubt sind Beim Parsen der fehlerhaften Quelltexte erkennt der Parser alle Fehler bis auf den ung ltigen abstract final Ausdruck Die Quelltexten mit problematischen Newlines bereiten dem Parser berhaupt keine Schwie rigkeiten Eine bersicht zu den Testergebnissen findet sich in Tabelle 11 Tesiquelltext Nein Nein Nein a Nein Nein ForEachInShouldGiveParseError J line 23 col 13 Ipar expected line 23 col 23 dot expected line 23 col 28 dot expected AbstractEnumShouldGiveParseErro Fehler nicht erkannt AbstractFinalShouldGiveParseError Nein Fehler nicht erkannt PublicPrivateShouldGiveParseError Ja line 14 col 20 illegal combination of modi fiers public private TestZeilenumbrueche ASCII Tabelle 11 Ergebnisse Parsingtests
22. berschrieben 1 Farameter auswerten F alscheing abe Abbruch Dk 2 Dateien sammeln 3 Leeren TGraph amp leere Symboltabelle erzeugen Dateilizte ni chtl eer Ende Dateiliste nicht ereicht 4 Datei parsen TGraph leer Symboltablle leer 4 ASTtraversieren dabei Graphelemente erzeugen und Symboltabelle f llen TGraph um eine Symboaltabelle mit Quelltextreprasentation zus tzlichen Definitionen gr er aus Quelltext 5 brige Quelltextreferenzen aufl sen Ze amp aufgelosten pasa datastorex o Toran abspeichern o Toran abspeichern abspeichern TGraph in Datei Ende Dateiliste erreicht ei Fertig Abbildung 6 Aktivit tsdiagramm Ablauf des Extraktionsprozesses 33 7 Funktionsweise des Javaextraktors Bei diesem Ablauf ist zu beachten dass bei einem Programmaufruf f r alle dabei analysierten Quelltexte nur ein gemeinsamer Graph erzeugt wird Eine genaue Beschreibung zu einzelnen Punkten folgt in den n chsten Abschnitten 7 1 Erzeugung des TGraphen im Treewalker Die Umsetzung der Struktur des vom Parser f r jede Quelltextdatei erzeugten AST zum TGraph geschieht im Treewalker Grunds tzlich w re es m glich und hinsichtlich Ausf h rungsgeschwindigkeit und Speicherverbrauch etwas effizienter den TGraph bereits w hrend des Parsings mit aufzubauen Die Grammatik des Treewalkers ist aber erheblich kompakter und lesbarer als die des Parsers Dies verei
23. javaextractor adapters CharScannerAdapter Unicode Escapesequenzen in Java besitzen das Format Vuxxxx wobei xxxx der Hexadezimalcode des Zei chens ist z B u00e4 f r F r detaillierte Aufstellung der Ergebnisse der Parsingtests siehe Anhang C und D im Package javaextractor 14 4 3 N tige Anpassungen antir Char Scanner antir Lexer Shared Input State file String offset int CharscannerAdaptenLexerSharedinputState CharScannerAdaptenInputBuffer getColumn int getLina int getOftset int javaextractor JavaLlexer Jawalexer dapter JavaLexerAdaptenLexerSharedinputState make Tokentinti Token annnotate CammoanT oaken amp dapter woid gettilehame String getOftset int LexerSharedinputStateAdaptenInputBuffer LexerSharedinputStateAdapten String InputStream LexerSharedinputStateAdapten String reset woid setCoalumncint woid Wird durch ANTLR aus jawa g erzeugt controls newline woid tab woid Abbildung 1 Klassendiagramm Auszug aus Package javaextractor adapters 15 4 ANTLR zu Beginn der Lexergrammatik dient CharScannerAdapter nun als Basistyp f r den er zeugten Lexer Damit der Offset richtig berechnet wird erbt der JavaLexerAdapter vom erzeugten Lexer und berschreibt die Methoden newline und tab 9 Um die neue Funktionalit t zu nutzen muss ein LexerSharedInputStateAdapter in stanziiert werden und bei d
24. plizieren aber eine Implementierung des Faktenextraktors als Eclipse Plugin so dass eine In tegration als Kommandozeilenwerkzeug in Gupro entf llt Cocktail entf llt aufgrund der Tatsache dass es kostenpflichtig ist und mit den verf gbaren Demoversionen keine genaue Evaluierung der Funktionalit t m glich ist Coco R unterst tzt derzeit nur Java bis Version 1 4 1st nur begrenzt dokumentiert und bietet keine automatische Erzeugung eines AST an Somit verbleiben noch JavaCC CUP und ANTLR in der engeren Auswahl JavaCC ist sehr gut dokumentiert und besitzt eine gute Community bietet aber ebenfalls keine automatische 111 C Dokumentation der Onlinerecherche Erzeugung des AST an Dar ber hinaus ist die derzeit verf gbare Grammatik f r Java 1 5 fehlerhaft CUP erzeugt ebenfalls keinen AST ist nur begrenzt dokumentiert und liefert dar ber hinaus keinen eigenen Lexer mit ANTLR erzeugt im Gegensatz zu den letzten drei genannten Projekten auch automatisch einen AST und entspricht lediglich bei der Abfrage der Position des Token nicht ganz unseren Vorstellungen An dieser Stelle sei ein Ausblick auf den soweit m glich absch tzbaren Aufwand der n chs ten Schritte geworfen Bei allen Tools w re es notwendig eine Funktionalit t zu implemen tieren welche die Kommentare mit in den AST aufnimmt Bei JavaCC st nde zus tzlich eine Funktionalit t zur Erzeugung des AST sowie eine Korrektur der Grammatik aus Bei CUP w
25. 0 x to InterfaceDefinition 1 1 EdgeClass lsSuperClassOflnterface IsSuperClassOf from TypeSpecification to InterfaceDefinition 1 1 EdgeClass IsInterfaceBlockOf IsBlockOf from Blockt 1 1 to InterfaceDefinition 1 1 VertexClass VariableDeclaration FieldDeclaration Statement VertexClass EnumConstant Member FieldDeclaration EdgeClass IsAnnotationOfEnumConstant IsAnnotationOf from Annotation 1 1 to EnumConstant 1 1 EdgeClass IsEnumConstantNameO f AttributedEdge from Identifier 1 1 to EnumConstant 1 1 EdgeClass IsArgumentOfEnumConstant IsArgumentOf from Expression x to EnumConstant 1 1 EdgeClass IsEnumConstantBlockOf IsBlockOf from Block 1 1 to EnumConstant 1 1 VertexClass EnumDefinition Type EdgeClass IsModifierOfEnum IsModifierOf from Modifier to EnumDefinition 1 1 EdgeClass IsEnumNameOf AttributedEdge from ldentifier 1 1 to EnumDefinition 1 1 EdgeClass isinterfaceOfEnum IsInterfaceOf from TypeSpecification to EnumDefinition 1 1 EdgeClass IsEnumBlockOf IsBlockOf from Block 1 1 to EnumDefinition 1 1 VertexClass AnnotationDefinition Type EdgeClass IsModifierOfAnnotation IsModifierOf from Modifier to AnnotationDefinition 1 1 EdgeClass IsAnnotationDefinitionNameOf AttributedEdge from Identifier 1 1 to AnnotationDefinition 1 1 18 i4 EdgeClass IsMe
26. 131 D Erweiterte Tests des ANTLR generierten Parsers n l catch Exception e ol Outputappend parser exception rel i Outputappend message e toString Outputappend stack Trace ToString e System err print pa e printStackTrace so we can get stack trace 125 126 127 public static void do TreeAction String f AST t 29 String tokenNames 30 If t 2null return 3 If showTree 1 132 CommonAST t setVerboseStringConversion true tokenNames 33 ASTFactory factory new ASTFactory 34 AST r factory create 0 AST ROOT al r setFirstChild t el final ASTFrame frame new ASTFrame Java AST r 37 frame setVisible true ss frame addWindowListener new WindowAdapter 140 public void windowClosing WindowEvent e 141 frame setVisible false hide the Frame 142 frame dispose 143 oystem exit O 144 145 146 w System out printin t toStringList 148 l JavalreeParser tparse new JavalreeParser iso try isi tparse compilationUnit t 152 catch RecognitionException eil ul Outputappend e getMessage 155 outputappend stackTraceToString e 5 System err print s e printStack Trace gi E 159 160 161 132 D 5 Quelltexte CMM 1 1 522 v Listing 16 LogParser java o char c u0009 this literal is valid d Anderungs
27. 28 show Tree true J 129 D Erweiterte Tests des ANTLR generierten Parsers 30 3l 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 15 outputappend args i doFile new File args i argslil parse it get end time amp calculate difference Date enddate new Date outputappend Endzeit enddate toString long timerequired enddate getTime startdate get Timer outputappend Zeit ben tigt Long toString timerequired 3600000 Long toString timerequired 1 3600000 60000 Long toString timerequired 1 60000 1000 Long toString timerequired 1000 Long toString timerequired ms FileOutputStream mystream new FileOutputStream ParserLog txt mystream write resultOutPut toString getBytes resultOutPut length mystream close else System err printin Usage java _ showtree lt directory or file name j catch Exception e System err printin exception e e printStack Trace System err so we can get stack trace j j private static void outputappend String toAppend resultOutPut append toAppend n private static String stack TraceToString Exception e Stri
28. 3 14 x 2 errors 151 el x mport java io x i public class ForEachInShouldGiveParseError 123 C Dokumentation der Onlinerecherche 2 public void printArray 22 23 int iaa new int 10 10 24 for each int iaf in iaa 25 26 for each int i in ia 27 28 oystem out println i Listing 13 ForBachInShouldGiveParseError java x Diese Klasse kombiniert die Modifier public und private welche sich gegenseitig ausschliessen Erzeugt beim x Kompilieren mit javac folgenden Fehler x PublicPrivateShoulaGiveParseError java 15 x illegal combination of modifiers public and private x public private void someMethod x A i0 x 1 error al x import java io x oo nN A N ui public class PublicPrivateShouldGiveParseError wi public private void someMethod m d 18 do nothing a 3 Listing 14 PublicPrivateShouldGiveParseError java 124 D Erweiterte Tests des ANTLR generierten Parsers D 1 Beschreibung Um festzustellen ob der mit ANTLR erzeugte Parser bis hierhin noch nicht aufgedeckte Schwachstellen oder Fehler besitzt war es nun notwendig weitere Tests durchzuf hren Eben so war es notwendig den Parser auf seine Verarbeitungsgeschwindigkeit hin zu pr fen Alle im folgenden genannten Ergebnisse beziehen sich auf den Parser welcher aus der ANTLR Grammatik f r Java 1 5 von Michael Studman erzeugt wurden Die beiden and
29. D 4 Benchmarks D 4 Benchmarks An dieser Stelle haben wir die Verarbeitungsgeschwindigkeit des Parsers untersucht indem wir die Zeiten f r das Parsing der kompletten Quelltexte des JDK bzw von Eclipse gemessen haben n here Informationen ber deren Umfang finden sich weiter oben im Abschnitt der Breitentests Mit einer Verarbeitungsdauer von 1 06 Minuten f r das JDK und 1 58 Minuten f r Eclipse auf einem System mit 3 2GHz Intel P4 kann man durchaus von einer sehr schnellen Verarbeitung sprechen so dass ein von ANTLR erzeugter Parser als ausreichend schnelle Grundlage f r den Faktenextraktor betrachtet werden kann D 5 Quelltexte import java io x import antlr collections AST import antlr collections impl x import antlr debug misc x import antlr x import java awt event x import java util x oo nN A o N class LogParser u Static boolean show Tree false 13 Static StringBuilder resultOutPut new StringBuilder is public static void main String args wi Use a try catch block for parser exceptions u try mi If we have at least one command line argument 9 If args length gt 0 21 get start time 21 Date startdate new Date l Ooutputappend Startzeit startdate toString s System err printin Parsing for each directory file specified on the command line zl for int i20 i lt args length i 1 27 if args i equals showtree 1
30. Der Test verlief hier fast v llig fehlerfrei lediglich 4 Dateien konnten nicht geparst werden Allerdings konnten eben diese 4 in der vorliegenden Form auch nicht direkt mit javac kompiliert werden Der Grund 125 D Erweiterte Tests des ANTLR generierten Parsers hierf r liegt in den enthaltenen Quelltexten welche Code enth lten der Konstrukte wie in Listing 15 enth lt Options in the template hasDefault 9oif hasDefault else endif oo nN gt N Listing 15 Ein Beispiel f r ant spezifischen Code in den Eclipse SDK Quelltexten Dies ist allerdings kein g ltiger Javacode Da die Erzeugung von Eclipse mittels ant einer Art make Tool geschieht wird dieser Code jedoch vor der eigentlich Kompilierung nochmals modifiziert Somit sind die vier aufgetretenen Fehler kein Indiz f r ein Versagen oder eine Unvollst ndigkeit des Parsers sondern durchaus berechtigt D 2 3 ANTLR Im Vergleich mit dem JDK und Eclipse sind die Quelltexte von ANLR mit 307 Dateien und etwa 2 MB eher klein Das Parsing verl uft hier bis auf eine Datei fehlerfrei Diese Datei befindet sich jedoch lediglich unter den mitgelieferten Beispielen von ANTLR und kann auch mit javac nicht kompiliert werden so dass auch hier der Grund f r das Versagen schlicht und einfach falscher Code ist und nicht der Parser D 2 4 Fazit Beim Parsen von existierenden Anwendungen konnten alle Quelltexte fehlerfrei geparst wer den die
31. Grammatiken weiter zu vererben Zur Erzeugung der gew nschten Programme werden die Grammatiken dann per Kommando zeilenparameter an ANTLR bergeben Den Zusammenhang der Grammatikdateien und die Funktionsweise der erzeugten Programme stellt Abbildung 33 grob dar Der Aufbau dieser Grammatiken wird im n chsten Abschnitt konkretisiert E 1 2 Aufbau der Grammatiken Alle drei Grammatikarten f r Lexer Parser und Treeparser sind auf die selbe Weise aufge baut und werden in der ANTLR Metasprache geschrieben Ziel ist es m glichst lesbare und somit verst ndliche Grammatiken zu erhalten Dabei k nnen die verschiedenen Grammatiken wahlweise in einer gemeinsamen Datei jeweils in einer eigenen oder in einer Kombination davon stehen Die Grammatiken beginnen mit einer optionalen Pr ambel es folgt verpflichtend die Defi nition der Parserklasse optional Header Optionen Tokendefinitionen und eigene Methoden Daran schlie t sich wieder verpflichtend die Definition der Regeln an 23CUP kann keine eigenen Lexer erzeugen Es muss zun chst ein passender Lexer geschrieben oder mit einem Scannergenerator wie JLex erzeugt werden 134 EI Grundlagen Input Lexergrammatik class MyLexer extends Lexer options lookahead 2 MyLexer WS TAB BREAK ID NAME TITLE gt Parsergrammatik Tokenstream class MyParser extends Parser options buildAST true ANTLR MyParser pe INT DOUBLE
32. Listing 33 Regel mit semantischem Pradikat Ein amp Ausgabeargumente Jede Regel kann mit Elementen fiir die Ein und Ausgabe von Werten erweitert werden Diese machen i d R nur Sinn wenn die bergebenen Wer te denn benutzt werden M glich ist dies als Argument in einer Regelreferenz oder durch Verwendung in einer semantischen Aktion Durch Anh ngen des Typs mit einem Variablennamen in eckigen Klammern an den Regel namen kann einer Regel ein Eingabewert bergeben werden Damit eine Regel einen Wert zur ckgibt reicht es dem Regelnamen das Schl sselwort returns sowie in eckigen Klam mern den Ausgabetyp mit Variablennamen anzuh ngen Im Beispiel aus Listing 34 wird der Eingabewert per semantischer Aktion nur an das Ausgabeargument weitergegeben type String in returns String out classOrInterfaceType builtInType out in Listing 34 Regel mit Ein und Ausgabe Zugriff auf Symbole Alle Symbole in der Grammatik werden zur Laufzeit durch Objekte repr sentiert Um auf diese w hrend der Laufzeit 1n einer semantischen Aktion zuzugreifen stellt ANTLR ebenfalls Sprachelemente zur Verf gung Soll auf ein Objekt zugegriffen werden muss das entsprechende Symbol mit einem Label markiert werden Ein Label 1st ein dem Symbol vorangestellter Identifier mit Doppelpunkt In Listing 35 wird der Text eines Objekts welches das Symbol builtInType repr sentiert ausgegeben Auf diese Weise kann dies nur in Parser und Tre
33. Mehrfachvererbung erlaubt ist und Java dies nur in Schnittstellen erlaubt 6 7 Package javaextractor schema impl In diesem Package sind Kanten und Knotenklassen enthalten die in den TGraphen vor kommen welche vom Javaextraktor erzeugt werden Auch diese wurden automatisch von TgSchema2Java aus dem Schema siehe Anhang B generiert F r jeden Knoten und Kan tentyp aus dem Metamodell existiert hier eine gleichnamige Klasse mit dem Suffix Impl welche ihre Schnittstelle sowie die Schnittstellen ihrer Oberklassen aus javaextractor schema implementiert Jede Kantenklasse implementiert de uni koblenz jgralab Edge und jede Knotenklasse de uni koblenz jgralab Vertex Zus tzlich dazu wurde f r jeden Kantentyp eine Reversed Klasse generiert Dabei handelt es sich um die jeweilige Kante in umgekehrter Richtung was eine effizientere Traversierung der generierten TGraphen erm glicht 30 6 7 Package javaextractor schema impl S ymbolTable SymbolTable Local Resolver Za LacalResalvemSymboalT able void resolved boolean Resolwer attach Type Qualified Type void attach String Qualified Type woid replaceByResolvedOne String GQualifiedTwypae void resolve TypeSpecificationsE tractiontlode boolean TypeSpecificationResolvenSymbolT able FieldResolwer uses FieldResolvenSymbolT able resolveFieldaExtractiontiode boolean resolveSingleField Extractiontiode FieldAggess boo
34. anschlie end der Lexer als Konstruktorparameter bergeben wird Der ei gentliche Parsingvorgang beginnt mit dem Aufruf der Parsermethode welche den gleichen 150 E 2 Ein Beispieltaschenrechner Namen wie das Startsymbol tr gt In unserem Taschenrechner Beispiel sieht diese Klasse nun wie in Listing 42 aus import antlr public class Main public static void main String args throws Exception Hier werden die Ausdruecke per Konsole eingegeben ExprLexer lexer new ExprLexer System in ExprParser parser new ExprParser lexer parser expr Listing 42 Klasse die dem Benutzer Lexer und Parser zur Verf gung stellt Nach dem Kompilieren mit javac x java und dem Aufruf mit java Main wobei das ANTLR Paket noch mit im CLASSPATH aufgef hrt sein mu k nnen ber die Tastatur arithmetische Ausdr cke eingegeben werden die dann auf ihre Korrektheit gepr ft werden Ausdr cke wie 3 4x5 werden akzeptiert 3 hingegen nicht Eine Auswertung des Aus drucks erfolgt bisher nicht dazu jedoch mehr im n chsten Abschnitt E 2 4 Auswertung im Parser Die Auswertung der arithmetischen Ausdr cke erfolgt ber semantische Aktionen Dies kann bereits im Parser geschehen dazu muss dessen Grammatik wie im Listing 43 aufgef hrt erweitert werden class ExprParser extends Parser expr returns int value l int x value mexpr PLUS x mexpr value x MINUS x mexpr value x mexpr returns int value
35. auch in der vorliegenden Form mit dem Java Compiler erzeugt werden konnten so dass wir diese Tests als vollst ndig bestanden bewerten D 3 Test mit Textinternationalisierungsoptionen Da es bei den ersten Tests aller Tools bereits auff llig oft an den Quelltexten mit Unicode bzw nicht ASCII Text zu Fehlern kam haben wir auch hier weitergehende Tests durchgef hrt 126 D 3 Test mit Textinternationalisierungsoptionen D 3 1 Unicode Bezeichner Beim ersten Test mit Unicode hatten wir lediglich auf die F lle getestet in denen Unicode bzw Unicode Escapesequenzen in den zugewiesenen Werten von String und char Variablen vorhanden waren Da Java 5 solche Zeichen aber auch an anderen Stellen wie Bezeichnern von Variablen und Klassen zul sst haben wir weitere Tests durchgef hrt Dabei haben wir Klassen und Variablenbezeichner sowohl mit Sonderzeichen siehe Listing 17 als auch den gleichen Code nochmals mit den entsprechenden Unicode Escapesequenzen siehe Listing 18 durchgef hrt Beide Dateien lieben sich mit javac kompilieren der Parser scheitert jedoch in beiden F llen beim ersten Bezeichner Die verwendeten Quelltexte befinden sich auch hier im Abschnitt D 5 D 3 2 Textencoding Bei diesen Tests haben wir einen einfachen Quellcode welcher sich fehlerfrei parsen lief in verschiedenen Textformaten abgespeichert Dabei kamen neben dem normalen ASCII auch die verschiedenen Unicode Varianten Unicode Big Endian UTF 8 UTF 7
36. des Package javaextractor 26 6 3 Package javaextractor comments CharScannerAdapter Verwendet den LexerSharedInputStateAdapter um die Token mit Positionsinformationen zu versorgen JavaLexerAdapter Erzeugt Token vom Typ CommonTokenAdapter welche die be n tigten Positionsinformationen tragen CommonASTAdapter Im Gegensatz zu ihrer Oberklasse h lt diese Klasse eine Referenz auf ihr zugrundeliegendes Token Das Token ist ein CommonTokenAdapter welches sei nen Offset kennt Die Positionsinformationen k nnen mit Methoden dieser Klasse abgerufen werden 6 3 Package javaextractor comments Die Klassen dieses Packages repr sentieren Kommentare die vom Lexer im Quelltext gefun den wurden Gefundene Kommetare k nnen somit in den TGraph an Parser und Treewalker vorbei aufgenommen werden Der Suffix Class im Namen einer Klasse dient zur Unter scheidung vom Knotentyp im TGraph CommentClass Diese abstrakte Klasse definiert die gemeinsame Funktionalit t aller Klas sen die Kommentare repr sentieren Alle Klassen dieses Packages erben von ihr und imple mentieren jeweils die Funktionalit t zum Erzeugen ihres Pendants im TGraph SingleLineCommentClass Repr sentiert einen einzeiligen Kommentar im Quelltext MultiLineCommentClass Repr sentiert einen mehrzeiligen Kommentar im Quelltext der kein Javadoc Kommentar ist JavaDocCommentClass Repr sentiert einen Javadoc Kommentar im Quelltext 27 6 Entwurf javaexztracio
37. ein Werkzeug gefunden welches den Parsingvorgang bernimmt so dass diese Funktion nicht selbst implementiert werden musste Zus tzlich wurde ein Javametamodell und entspre chendes Schema f r den TGraph entwickelt Die Knoten und Kantentypen des Metamodells konnten automatisiert mit JGraLab aus dem Schema erzeugt werden In der aktuellen Version bringt der Javextraktor Metamodell und Schema zur feingranularen Abbildung der Syntax mit W nschenswert sind weitere Metamodelle und Schemata die wei ter von der Syntax abstrahieren Denkbar sind Modell und Schemata f r TGraphen die z B ausschlieblich Vererbungshierarchien oder Benutzungsbeziehungen von Klassen darstel len Hier k nnten Projekte zur Weiterentwicklungen ansetzen da jeweils ein entsprechender Treewalker implementiert werden m sste 45 9 Abschlie ende Betrachtung Insgesamt kann die Entwicklung des Javaextraktors als positiv betrachtet werden da dieser nicht nur die zwingend geforderten Mindesteigenschaften besitzt sondern dar berhinaus auch eine Reihe weiterer optionaler Anforderungen erf llt 46 A Metamodell der Graphklassen Nach dem eigentlichen Metamodell mit den Knoten Kantenbeziehungen und der Knotenty penhierarchie folgt die Kantentypenhierarchie in einem eigenst ndigen Diagramm 47 A Metamodell der Graphklassen uesjoog jeujejxe O Suns aueu n Duum eureNpeyijenoAqng O ad 130uonejouuys 6 uonejouuy
38. eine Syntax definiert Sichtbarkeit einer Regel F r jede Regel kann die Sichtbarkeit per Modifizierer festge legt werden Da jede Regel in eine Methode umgesetzt wird kann somit bereits in der Gram matik auf die sp tere Sichtbarkeit Einfluss genommen werden Es gen gt dazu dem Regel namen einen Sichtbarkeitsmodifizierer voranzustellen Erlaubt sind private protected und public 139 E Detaillierte Funktionsweise von ANTLR private type classOrInterfaceType builtInType Listing 26 Regel mit Sichtbarkeitsmodifizierer Exceptions Auch das Ausl sen von Exceptions kann bereits in der Grammatik gesteuert werden Durch Anh ngen des Schl sselwortes throws mit der auszul senden Exception an den Regelnamen wird dies festgelegt Auf den ersten Blick macht diese Funktionalit t scheinbar keinen Sinn Zwar wird die angegebene Exception bei der Deklaration der Methode mit aufgef hrt doch wird die Exception niemals ausgel st Diese muss in einer semantischen Aktion manuell ausgel st werden a throws MyException A Listing 27 Eine Regel die eine Exception ausl sen kann Ferner k nnen in einer Regel mehrere Exceptionhandler definiert werden TODO beschrei ben oder geht das schon zu weit Optionen Wie bereits o a sind Optionen bis hinab auf Regel und Symbolebene m g lich Um Optionen f r eine Regel festzulegen reicht es dem Regelnamen das Schl sselwort options mit den gew nschten Optionen in geschweiften Kla
39. entsprechenden Produktionen von Hand implementiert werden Literatur Zu Coco R existiert nur wenig Literatur Auf der Homepage stehen ein recht aus f hrliches Handbuch zur Benutzung von Coco R und einer kurzen Beschreibung der Schnitt stellen der erzeugten Scanner und Parser sowie zwei Artikel die sich mit den Datenstrukturen des Parsergenerators und LL 1 Konfliktaufl sung besch ftigen Ferner existiert eine Mailing liste die ber Updates von Coco R informiert Eine ausgewachsene API Beschreibung Tuto rials oder ein Forum gibt es leider nicht Verwendung Auch die Verwendung von Coco R erfolgt ber die Kommandozeile Beim Aufruf muss als Parameter die Grammatik angegeben werden Die so erzeugten Scanner und Parser m ssen dann in einem eigenen Programm aufgerufen werden ben tigen aber keine Komponenten von Coco R zur Laufzeit Zu Testzwecken k nnen von der Homepage zu jeder Grammatik Testprogramme herunterge laden werden Eigene Erfahrung Coco R kommt als JAR Paket und kann sofern ein JDK installiert ist sofort benutzt werden Die Erzeugung des Javaparsers funktioniert wie im Benutzerhandbuch angegeben Zum Kompilieren muss sich dieser aber mit dem Testprogramm von der Homepa ge in einem package befinden was die Dokumentation leider verschweigt Nachdem wir diese H rde genommen hatten konnten wir ans Testen des Parsers gehen Auch eine Integration des Parsers in eigenes Projekt war anschliebend m glich Position amp
40. enumConstantField p 264 265 26 enumConstantField 267 we modifiers 268 typeDefinitionlnternal 269 typeParameters typeSpec 270 IDENT 271 parameterDeclarationList 272 declaratorBrackets 273 throwsClause 274 compoundStatement 275 variableDefinitions 276 172 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 interfaceExtends E2 Javagrammatik aus ANTLR compoundStatement extends classOrInterfaceType classOrInterfaceType implementsClause implements classOrInterfaceType classOrInterfaceType classF eld interfaceField modifiers typeDefinitionInternal typeParameters ctorHead constructorBody typeSpec IDENT parameterDeclarationList declaratorBrackets throwsClause variableDefinitions static compoundStatement modifiers typeDefinitionInternal typeParameters typeSpec IDENT parameterDeclarationList declaratorBrackets throwsClause 173 F Entwicklung eines neuen Metamodells 317 variableDefinitions 318 319 320 321 32 constructorBody 323 5 1 explicitConstructorInvocation
41. folgenden Prinzip 1 Am Beginn einer Regel wird ein Knoten der zur Regel quivalenten Knotenklasse im TGraph erzeugt 34 7 2 Sammeln und Berechnen der Positionsinformationen 2 Mit diesem Knoten wird nach jeder referenzierten Unterregel der von der Unterregel zur ckgegebene Knoten durch Erzeugen einer Kante der entsprechenden Kantenklasse verbunden 3 Am Ende der Regel wird der in Punkt 1 erzeugte Knoten zur ckgegeben Beim Erzeugen des Treewalkers aus der Grammatik generiert ANTLR aus jeder Regel eine eigene Methode Diese besitzen als R ckgabewert immer den Knoten des AST vom Typ AST dieser ist in ANTLR definiert der von der Regel durchlaufen wird Deswegen wird der erstellte TGraph Knoten am Ende der Regel in einer globalen Variable currentVertex vom in JGraLab definierten Typ Vertex zwischengespeichert Eine Ausnahme zum o a Prinzip bildet die Listenregel Dabei handelt es sich um eine Regel die zwar selbst wiederum mehrere Regeln referenziert jedoch zu ihr selbst keine Entsprechung als Knoten im TGraphen erzeugt Zum Beispiel referenziert die Regel einer Methodendekla ration die Regel parameters welche beliebig oft die Regel parameterDeclaration referenziert Gem dem Schema muss aber direkt eine Kante zwischen jeder Parameterdekla ration und der Methodendeklaration erzeugt werden In solchen F llen bergibt die referenzie rende Regel den eigenen Knoten z B vom Typ MethodDeclaration an die Listenregel ebenf
42. hrend der Implementierung des Javaextraktors fertig gestellt wurde und noch keine zu ANTLR 3 kompatible Grammatik f r Tava existierte Charakterisierung ANTLR ist ein Framework zur Erstellung von Compilern bzw deren einzelner Bestandteile mit besonderem Schwerpunkt auf der Unterst tzung von abstrakten Syntaxb umen Erzeugung Traversierung Konvertierung ANTLR liegt selbst in verschie denen Sprachen vor und kann LL Parser in Java C und erzeugen Dabei unterst tzt ANTLR die automatische Erzeugung von abstrakten Syntaxb umen Ein Treewalker zu deren Traversierung kann ebenfalls aus einer separaten zur eigentlichen Grammatik kompatiblen Baumgrammatk generiert werden Hinzu kommt eine graphische Benutzeroberfl che ANTLRWorks zum Entwickeln Debug gen und Testen von Grammatiken Zus tzlich existiert eine graphische Oberfl che f r die Be nutzung der Kommandozeilenwerkzeuge unter Eclipse ANTLR Studio genannt Allerdings stammt es von einem Dritten und ist kostenpflichtig F r Java 5 und ANTLR v2 7 6 sind drei verschiedene Grammatiken verf gbar Zus tzlich existieren Grammatiken f r eine Vielzahl weiterer Sprachen Die Syntax der Grammatiken f r ANTLR Version 2 und Version 3 unterscheidet sich 12 4 2 Funktionsweise von ANTLR Literatur und Support Auf der ANTLR Homepage 13 steht eine umfangreiche Doku mentation bestehend aus einer FAQ vielen Tutorials einem Benutzerhandbuch einem Wi ki einer API Bes
43. iic die dh di deck ik IECUR TRU STE 104 Ea RUTAS orae dt ntm fin qd Se ee SECUN YON BB ERAT Arte 105 4 Java Compiler Implementationen 107 E GCI p lt tebe eG oo eR Ko o So BOE SOE SOE 107 4 2 Java ESPIESSO esso Boas yi Soz ae air AE BB d ndi es 105 o EE dence d cta dir ctn dat od e 109 C 5 1 EME Eclipse Modeling Framework 109 so BS NE 110 ECO aA RU au y Eu E 9 0 0500 dr 111 Javaquellt xte f r Tests e os oem b omn aa ae RR UE a 112 D Erweiterte Tests des ANTLR generierten Parsers Db Beschreibung de ok exem eeu cedem D 2 Breitentests as 2 ei ne 11 777 D22 o x R sa b HE ud JANTLR zu e e 2 3 26 00 55 04 6 13 DA ruz xx sk x a e D 3 Test mit Textinternationalisierungsoptionen D 3 1 Unicode Bezeichner D32 TextenCodin om eum el yx r e Doo Paz se we ea Se DIA BENCHMARKS ee es Wer Wer ers D 3 Ouelltexte amp 4 2 end 2 EO ao wes E Detaillierte Funktionsweise von ANTLR Ed Gr ndlasen 4 de Zus Haaren E 1 1 Funktionsweise von ANTLR E 1 2 Aufbau der Grammatiken E 1 3 ANTLR Metasprache E 1 4 Regeln in der Lexergrammatik E 1 5 Regeln in der Parsergrammatik E 1 6 Re
44. import import static java lang System out ditto import java util x class TestJSR201 Berichtigt enum Color red green blue public static void main String args varargs x x for each on multi dimensional array int iaa new int 10 10 for int ia iaa for int i ia out print i use static import 117 C Dokumentation der Onlinerecherche 27 out printin 28 29 Ir x 30 IIl 31 Auskommentiert da der Compiler Color VALUES nicht kennt IIl aal for Color c Color VALUES 34 35 Ai switch c 36 37 case Color red ssl break s l case Color green out print G 40 break al Ai case Color blue out print B all Ai br eak al Ai default assert false ail Ai 45 asi IM P M M 47 out printin al W end of main s complex enum declaration from JSH 201 s public static enum Coin 53 penny 1 nickel 5 dime 10 quarter 25 54 Coin int value 55 56 this value value 57 58 private final int value 59 public int value 60 61 return value e 63 e public static class Card implements Comparable 66 java io Serializable e 1 68 public enum Rank 69 70 deuce three four five six seven 118 eight nine ten jack queen king ace public enum Suit clubs diamonds hearts spades private final Rank ran
45. m Quelltext enthaltenen Kommentare korrekt erkannt jedoch direkt verworfen d h Kommentare werden somit nicht im abstrakten Syntaxbaum abgebildet Da aber auch Kommentare mit in den Graph aufgenom men werden sollten mussten entsprechende Anpassungen vorgenommen werden Au erdem sollte zwischen einzeiligen mehrzeiligen und Javadoc Kommentaren unterschieden und eine entsprechende Repr sentation im Graphen erzeugt werden Da nicht immer festgestellt werden kann welchem Element ein Kommentar im Quelltext zugeordnet ist sollten alle Kommentare mit dem obersten Repr sentanten einer Quelltextdatei im TGraphen TranslationUnit verbunden werden Da der Graph beim Durchlaufen des abstrakten Syntaxbaums erzeugt werden soll w re eine Abbildung der Kommentare in diesen n tig gewesen Dazu h tten alle drei Grammatiken in gr erem Ma e angepasst werden m ssen da Kommentare fast an jeder beliebigen Stelle in Javaquelltexten stehen d rfen Deshalb wurde nur die Lexergrammatik modifiziert Der Lexer erzeugt keine Tokens die Kommentare repr sentieren Jedoch werden nun alle Kommentare einer Datei im Lexer gesammelt und stehen nach dem Parsen der Datei als Liste zur Verf gung Da sie f r die Funktion des Programms unerheblich sind 12Kommentare sind in Java berall dort m glich wo ein Leerzeichen stehen darf 17 4 ANTLR Die Kommentare k nnen dann per get Comment s abgefragt und in den Graph eingebaut werden Die Grammatiken
46. nd lich und die weitere Fortentwicklung kann als gesichert gelten wenn man zus tzlich die in zwischen weite Verbreitung von Eclipse bedenkt Die Dokumentation ist bei allen Teilen der Software in gr erem Ma e vorhanden Charakterisierung Bei Eclipse handelt es sich um eine frei verf gbare graphische Ent wicklungsumgebung Das Programm ist in Java implementiert und OpenSource Software C 5 1 EMF Eclipse Modeling Framework Charakterisierung Beim Eclipse Modeling Framework handelt es sich um die Architek tur hinter Eclipse Grunds tzlich stellt Eclipse lediglich die grundlegenden Funktionen einer Entwicklungsumgebung bereit und ist nicht auf eine bestimmte Programmiersprache festge legt Die Funktionalit t zum Entwickeln in bestimmten Programmiersprachen wird dabei ber 109 C Dokumentation der Onlinerecherche Plugins realisiert derzeit 1st eine offizielle Unterst tzung f r COBOL Fortran C C Java und AspectJ vorhanden sowie inoffiziell noch einige weitere wie z B CaesarJ Das EMF an sich bietet keinerlei Modellierungsstruktur welche feingranularer als die Klassenebene ist und ist folglich f r den geplanten Java Extraktor v llig ungeeignet Informationen zur genaueren Struktur der Konzepte von Eclipse EMF und Plugins finden sich u a in 10 C 5 2 JDT Core Eine kurze bersicht zu den wichtigsten Daten von JDT Code findet sich in Tabelle 23 Historie Die erste Version der JDT wurde im Juli 2002 ver ffent
47. oo N oo LA oo EN 74 Schema der Graphklassen EnumDomain PostfixOperators DECREMENT INCREMENT EnumDomain Builtln Types VOID BOOLEAN BYTE CHAR SHORT INT LONG FLOAT DOUBLE EnumDomain Modifiers PUBLIC PROTECTED PRIVATE STATIC FINAL ABSTRACT VOLATILE SYNCHRONIZED NATIVE STRICTFP TRANSIENT EnumDomain MethodlnvocationTypes METHOD CONSTRUCTOR SUPERMETHOD SUPERCONSTRUCTOR EXPLICITCONSTRUCTOR GraphClass Java5 name String version String abstract EdgeClass AttributedEdge from Vertex to Vertex x offset Integer length Integer line Integer column Integer abstract VertexClass Type ExternalDeclaration Member name String fullyQualifiedName String external Boolean abstract VertexClass Member abstract VertexClass TypeSpecification abstract VertexClass Statement abstract VertexClass Expression Statement abstract VertexClass ForHead abstract VertexClass FieldDeclaration 85 s VertexClass Annotation s VertexClass Block Statement s VertexClass Identifier name String s l VertexClass Modifier type Modifiers so VertexClass TypeParameterDeclaration Type ol VertexClass ParameterDeclaration FieldDeclaration o VertexClass TypeArgument TypeSpecification VertexClass MethodDeclaration Member 94 abstract EdgeClass IsAnnotationOf AttributedEdge from Annotat
48. schwierigen Ausgangssituation An dieser Stelle setzen die Gupro Tools zur Unterst tzung von Reengineering und Programm verstehen an Sie sollen den Wartungsingenieur dabei unterst tzen den Quelltext des Softwa resystems zu erschlie en Die Gupro Tools arbeiten dabei auf Graphrepr sentationen des Quelltextes welche dazu von programmiersprachenspezifischen Extraktoren aus dem Quelltext generiert werden Bisher existieren nur Extraktoren f r ltere Programmiersprachen Ziel der vorliegenden Studienarbeit war es einen Extraktor f r Java Code bis zur aktuellen Version 5 zu realisieren Dessen Entwicklung und Verwendung wird in diesem Dokument beschrieben wobei der Extraktor im Folgenden auch als Javaextraktor oder Faktenextraktor bezeichnet wird Diese Studienarbeit richtet sich an Leser die mindestens ber den Wissensstand eines Infor matikstudenten mit abgeschlossenem Vordiplom verf gen 1 1 Erkl rung der Begrifflichkeiten In diesem Abschnitt werden Begriffe definiert und erl utert die in dieser Arbeit h ufiger Ver wendung finden TGraph Jeder Graph besteht aus Knoten und Kanten Ein TGraph hat zus tzliche Eigen schaften er ist e typisiert Knoten und Kanten haben einen bestimmten Typ e attr butiert Knoten und Kanten k nnen beliebig viele Attribute besitzen somit auch keine Im Verlauf der Studienarbeit erschien Java 6 dieses besitzt im Vergleich zur Vorg ngerversion keine neuen Sprachkonstrukte so
49. sollen hinsichtlich ihrer Tauglichkeit f r dieses Projekt bewertet werden Erf llt Bewertung abgeschlossen 18 MUSS Recherchierte Werkzeuge sollten selbst 1m Falle der Unbrauchbarkeit f r die ses Projekt kurz beschrieben und abgehandelt werden Erf llt Abhandlungen erstellt F r eine detaillierte Ausf hrung zur Onlinerecherche siehe Anhang C 3 Onlinerecherche nach einem Javaparser 3 Onlinerecherche nach einem Javaparser Zur Extraktion von Fakten aus Javaquelltexten m ssen sie geparst werden Parsingtechniken werden schon lange im Compilerbau verwendet und stehen in einer Vielzahl von bereits exis tierenden Werkzeugen zur Verf gung Deshalb wurde zun chst eine umfangreiche Onlinere cherche vorgenommen Ziel war es ein bereits existierendes Werkzeug zu finden welches bei der Erf llung der Anforderungen aus dem letzten Kapitel von Nutzen sei und auf dessen Basis der Javaextraktor aufgebaut werden konnte Dieses Kapitel beschreibt zun chst Kriterien anhand derer die Funde bewertet wurden und schlieBt mit einer Aufstellung der Ergebnisse ab Eine detaillierte Ausf hrung der Onlinere cherche ist in Anhang C zu finden 3 1 Bewertungskriterien f r die gefundenen Werkzeuge Jedes gefundene Werkzeug wurde auf die folgenden Eigenschaften hin untersucht Parser in Java Zur Einbindung in den in Java zu entwickelnden Javaextraktor w re ein javabasierter Parser ideal Ferner w re der Javaextraktor dadurch plattformunab
50. value vom Typ String der den Wert dieses Ausdrucks enth lt Analog verh lt es sich bei den konstanten Ausdr cken f r die Typen Boolean Integer Long Float Double und Character Generell sind viele syntaktische Einschr nkungen der Ursprungsgrammatik in unserem Me tamodell nicht mehr vertreten Durch die Vereinfachung des Modells kam es zur Aufweichung der Einschr nkungen Es erlaubt mehr syntaktische Konstruktionen als die Grammtik mitun ter sogar falsche Diese Falschen zu identifizieren 1st jedoch Aufgabe des Parsers F 2 Javagrammatik aus ANTLR Folgenden Grammatik stammt in von Michael Studmann und ist f r Java 5 ausgelegt Um die se lesbarer zu machen haben wir sie von Kommentaren semantischen Aktionen usw bereinigt und in eine EBNF konforme Syntax berf hrt Ferner wurden in allen Regeln die Tokenrefe renzen durch das urspr ngliche Terminalsymbol ersetzt Diese Grammatik stellt somit eine vereinfachte Verschmelzung von Lexer und Parsergrammat k dar i compilationUnit 2 Ru packageDefinition 3 mportDefinition 4 typeDefinition 5 EOF s packageDefinition 9 annotations package identifier p importDefinition 13 ue import static identifierStar e typeDefinition 17 5 modifiers 18 typeDefinitionInternal 19 166 40 4 4 N 43 44 45 46 4 48 49 E2 Javagrammatik aus ANTLR typeDefinitionInternal i classDefinition
51. verwendeten Parser bzw Grammatiken untersucht Der Originalcompiler von Sun ist selbst leider nicht quelloffen im Gegensatz zur Klassenbiblio thek des JDK und schied damit aus C 4 1 GCJ Eine kurze bersicht zu den wichtigsten Daten von GCJ findet sich in Tabelle 21 107 C Dokumentation der Onlinerecherche Historie Die erste Version des GCC wurde im M rz 1987 ver ffentlicht damals allerdings noch als reiner C Compiler Mit der Zeit wurden Compiler f r weitere Sprachen integriert und der GNU C Compiler zur GNU Compiler Collection beides als GCC bezeichnet um benannt Mit der Version 2 95 welche im Juli 1999 ver ffentlicht wurde wurde erstmals ein Java Compiler integriert Mittlerweile ist die GCC bei Version 3 4 5 Ver ffentlichung vom 30 11 2005 angelangt und die derzeitige Entwicklung konzentriert sich auf die Version 4 von welcher bereits Entwicklerversionen verf gbar sind Charakterisierung Der GNU Compiler for the Java tm Programming Language GCJ siehe 1321 ist Teil der GNU Compiler Collection welche neben dem GCJ auch Compiler f r C C Objective C Fortran und Ada sowie Bibliotheken f r die genannten Sprachen bein haltet Die komplette GCC ist quelloffen unter der GNU Public License GPL verf gbar Der GCJ selbst ist in C geschrieben und benutzt einen mit Bison erzeugten Parser Bison ist ein Parsergenerator welcher kontextfreie LALR Parser in C erzeugt Bison selbst ist ebenfalls Teil des GNU Projek
52. werden Diese k nnen dann beispielsweise in den semantischen Aktionen von Grammatikregeln zum Einsatz kommen Regeldefinitionen Grunds tzlich wird wie auch die Pr ambel dieser letzte Teil nicht in geschweiften Klammern eingefasst Es handelt sich dabei 1 d R um den umfangreichsten Abschnitt Deshalb wird den Regeldefinitionen ein eigener Abschnitt gewidmet E 1 3 ANTLR Metasprache Alle Regeln werden in einer EBNF hnlichen Notation definiert Zu den Elementen der EBNF kommen erg nzende Operatoren und neue Elemente f r Sichtbarkeit Exceptions semantische Aktionen Eingabe amp Ausgabeparameter sowie syntaktische amp semantische Pr dikate hinzu Diese Menge von Elementen bildet die ANTLR Metasprache n heres siehe 17 Das in den folgenden Paragraphen jeweils beschriebene Element ist im dazugeh rigen Beispiel farblich hervorgehoben Schl sselworte sind unterstrichen Operatoren Grunds tzlich sind alle syntaktischen Elemente der EBNF vertreten Im Ge gensatz zur richtigen EBNF werden in der ANTLR Metasprache eckige und geschweifte Klammern jedoch f r andere Zwecke verwendet Deshalb werden diese durch andere Kon strukte ersetzt und erg nzt Tabelle 25 listet diese auf Zu den ersten vier Operatoren existieren in der EBNF unmittelbare Pendants Der Bereichs operator ist Jedoch nur durch eine verkettete Veroderung in EBNF realisierbar Er dient der Bequemlichkeit des Grammatikschreibers es gen gt zum Bei
53. 1 ANTLR Adder Tutorial Extent Tracking Tokens with Values and Error Reporting Ver sion 1 5 http www milk com kodebase antlr tutorial Abruf 01 2008 5 Bracha Gilad 2005 The Java Language Specification Third Ed Sun Microsystems 2005 http java sun com docs books jls third edition html I I enem Abruf 01 2008 6 Ebert J rgen Gimnich Rainer Stasch Hans H Winter Andreas 1998 Gupro Generische Umgebung zum Programmverstehen Koblenz F lbach 1998 ISBN 3 923532 59 8 7 Gamma Erich Helm Richard Johnson Ralph Vlissides John 1995 Design Patterns Objects of Reusable Object Oriented Software Sechste Auflage Reading Massachusetts Addison Wesley 1996 ISBN 0 201 63361 2 8 Gosling James Joy Bill Steele Guy 1996 The Java Language Specification First Ed Sun Microsystems 1996 http java sun com docs books jls first edition html index html Abruf 01 2008 182 Literatur 9 Gosling James Joy Bill Steele Guy Bracha Gilad 2000 The Java Language Specification Second Ed Sun Microsystems 2000 http java sun com docs books jls second edition html j title doc html Abruf 01 2008 10 Hinterw ller Bodo 2005 Metamodell basierte Spezifikation von Refactorings Zugl Koblenz Univ Dipl 2005 11 Kahle Steffen 2006 JGraLab Konzeption Entwurf und Implementierung einer Java Klassenbibliothek f r TGraphen Zugl Koblenz Univ Dipl 2006 12 March
54. 149 return x y 150 151 H 152 minus 153 154 double eval double x double y 155 156 return x y 157 158 H 120 C 7 Javaquelltexte f r Tests 159 times 160 161 double eval double x double y 162 163 return x x y 164 165 H 166 divided by 167 168 double eval double x double y 169 170 return x y 171 172 uH 173 val Perform arithmetic operation represented by this constant 175 abstract double eval double x double y 176 177 public static void main String args 178 179 double x Double parseDouble args 0 180 double y Double parseDouble args 1 i M 182 Ai Auskommentiert da in Compiler VALUES nicht kennt 183 I M 1841 Ai for Operation op VALUES 185 Ai out printinx op 4 186 Ai y 4 op eval x y 187 3 x erlaubt ist Erzeugt beim Kompilieren mit javac al x folgenden Fehler 5 e x AbstractEnumShouldGiveParseError java 3 7 x modifier abstract not allowed here s x public static abstract enum Operation A 9 wm x Terror 121 C Dokumentation der Onlinerecherche 111 il 13 class AbstractEnumShouldGiveParseError is public static abstract enum Operation e 1 17 plus 18 19 double eval double x double y 20 21 return x y 22 23 H 24 minus 25 26 double eval double x double y 27 28 return x y 29
55. 24 178 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 5 Nn 5 556 557 558 559 560 561 562 563 564 565 E2 Javagrammatik aus ANTLR hiftExpression j instanceof typeSpec shiftExpression additiveExpression lt lt gt gt gt gt gt additiveExpression j additiveExpression multiplicativeExpression multiplicativeExpression j multiplicativeExpression 2S unaryExpression x Z 9 unaryExpression unaryExpression unaryExpression unaryExpression unaryExpression unaryExpression unaryExpressionNotPlusMinus unaryExpressionNotPlusMinus unaryExpression I unaryExpression builtinTypeSpec unaryExpression classTypeSpec unaryExpressionNotPlusMinus postfixExpression 9 postfixExpression 7 primaryExpression typeArguments 179 F Entwicklung eines neuen Metamodells 566 IDENT argList 567 super 568 argList 569 ae ll typeArguments IDENT 5 argList yes 570 571 this newExpression expression 572 573 574 575 576 577 578 s pr maryExpression 580 identPrimary constant true false null newExpressio
56. 4 475 476 477 478 479 480 481 482 483 484 F2 Javagrammat k aus ANTLR forInit declaration expressionList forCond expression forlter expressionList tryBlock 7 try compoundStatement handler finallyClause finallyClause finally compoundStatement handler 1 catch parameterDeclaration compoundStatement expressionList expression expression expression 7 assignmentExpression assignmentExpression conditionalExpression 177 F Entwicklung eines neuen Metamodells lt lt amp ANA 485 486 487 488 2 489 490 assignmentExpression 491 492 493 44 conditionalExpression 495 logicalOrExpression assignmentExpression conditionalExpression 496 497 4s logicalOrExpression 499 pe logicalAndExpression II logicalAndExpression 500 501 so logicalAndExpression 503 a inclusiveOrExpression amp amp inclusiveOrExpression 504 505 so inclusiveOrExpression 507 exclusiveOrExpression Pale exclusiveOrExpression 508 509 so exclusiveOrExpression 511 Te andExpression andExpression 512 513 s4 andExpression 515 equalityExpression amp equalityExpression 516 517 ss equalityExpression 519 relationalExpression 5 relationalExpression 520 521 s2 relationalExpression 523 75 shiftExpression 5
57. Coco R C 2 4 Cocktail Eine kurze bersicht zu den wichtigsten Daten von Cocktail findet sich in Tabelle 14 95 C Dokumentation der Onlinerecherche Rechercheergebnis frei verf gbar Tabelle 12 bersicht Coco R Historie Die Entwicklung der ersten Version der Cocktail Toolbox begann 1988 an der GMD Forschungsstelle der Universit t Karlsruhe Nachdem die Forschungsstelle Ende 1993 geschlossen wurde bernahm Josef Grosch die Rechte und gr ndete die Firma CoCoLab sie he 27 Die Software ist inzwischen kostenpflichtig und erh lt in gr eren aber regelm igen Abst nden Updates Charakterisierung Die Cocktail Toolbox beinhaltet eine Reihe von Werkzeugen f r den Compilerbau die Programmtransformation und die Programmanalyse Ziel bei der Entwick lung dieser Werkzeuge war eine gesteigerter Umfang und eine gesteigerte Leistungsf higkeit im Vergleich zu Lex Yacc In der Toolbox sind u a Generatoren zur Erzeugung von LL 1 LR 1 und LALR 2 Parsern sowie auch ein AST Generator und Transformator enthalten Dabei unterst tzen die Tools neben anderen Sprachen wie Cobol PL I SQL C C C und VB auch Java bis einschlie lich Version 5 und sind unter einer graphischen Benutzeroberflache zusammengefasst Verwendung Da die Nutzung kostenpflichtig ist steht auf der Homepage nur eine be schr nkt lauff hige Version zur Verf gung Diese kommt ohne Oberfl che und besteht im We sentlichen aus einer Samm
58. FOO ype ST Treeparsergrammatik class MyTreeparser extends Treeparser options lookahead 2 MyTreeparser line ID t type t getText Output Abbildung 33 Funktionsweise von ANTLR 135 E Detaillierte Funktionsweise von ANTLR Pr ambel Definition der Parserklasse Header Optionen Tokendefinitionen Eigene Methoden Regeldefinitionen Abbildung 34 Aufbau einer Grammatik Pr ambel Der Inhalt aller Zeilen vor der Definition der Parserklasse nennt sich die Pr ambel Diese wird unver ndert vor den Quelltext der erzeugten Klasse kopiert also noch vor die Definition der Klasse Dies dient z B dem Einf gen von Kommentaren Importklauseln f r zus tzlich ben tigte Klassen oder einer Packagedeklaration in Java Definition der Parserklasse Diese hnelt dem Aussehen einer Klassendefinition mit Ableitung einer Oberlasse in Java und legt fest ob es sich dabei um eine Grammatik f r einen Lexer Parser oder Treeparser handelt Beispiel siehe Listing 19 Tats chlich f hrt standard m ssig in Java die Angabe von Lexer zur Ableitung der Klasse antlr CharScanner Parser zur Ableitung von antlr LLkParser und TreeParser zur Ableitung von antlr TreeParser Wird eine andere Klasse ben tigt so kann diese in Klammern und Anf hrungszeichen nach der Definition angegeben werden Beispiel siehe Listing 20 Diese muss selbst allerdings eine Subklasse der jeweiligen oben angef hrten Klassen sein
59. Java Sprachspezifikation bis Version 1 4 grenzwertige dennoch erlaubte Ausdr cke enth lt Als n chstes testeten wir ob die Parser mit Unicode Escapesequenzen umgehen k nnen Anschliebend mussten die Parser Klassen verarbeiten die jeweils nur einen Java 5 Ausdruck benutzen Darauf aufbauend mussten diese zeigen dass sie auch Klassen akzeptieren die aus vielen komplizierten Kombinationen von Java 5 Ausdr cken bestehen diese haben wir den Testquelltexten von CUP entnommen In der zweiten Phase wurden nur Klassen bersicht siehe Tabelle 5 geparst die vom Java Compiler javac nicht fehlerfrei bersetzt werden k nnen Dazu haben wir Klassen genommen die nicht aufgrund des Typecheckings sondern aufgrund ung ltiger Ausdr cken nicht kompi liert werden k nnen Dabei handelt es sich u a um ung ltige Kombinationen von Modifiern und um das for each in Konstrukt welches in einer Preview von Java 5 noch erlaubt war aus Kompatibilit tsgr nden aber nicht mehr in der endg ltigen Fassung ent halten ist In der dritten Phase schlie lich sollten die Parser zeigen dass sie mit den unterschiedlichen Zeilenumbr chen der Betriebssystemwelt umgehen k nnen Dazu haben wir f r jede Art von Zeilenumbruch den Parsern eine separate Klasse bersicht siehe Tabelle 6 sowie eine mit der Kombination aller Umbr che zum Parsen gegeben Testquelltexte Inhalt Eric Grenzwertige dennoch erlaubte Ausdr cke 4 bis Java 1 4 Esc
60. Jos 55 IS 558 12 5 sse 5JjOJo3oureJeded L Ss m I T uonuuu qsser SJ IJIPON edA a 1eyipoiy Abbildung 9 Metamodell Teil 2 12 49 A Metamodell der Graphklassen uojssa1 dx3 E Swenp gt ylend T JQoWeNUOHeOUUYS T T Buijs sueu o Bus asueu a Bus sueu a SISIHIPOnN edA a uopeoynedsadAL Joynuep 6 og E uonezouuy Jeynuep 6 19yipoy I I I ns JOUONEJO0UUYEIIAS uonejouuyjOJeHuIpols Jo3euueaueged jjopunogueddps JOOPO quonejouuys JOeuieNuonea4e eque3eurejegedA s T T uone ep q ureed dAL JOeureNuoniugequonexo uys uoniuyequone3ouuy E Bus sweu a s aly poyy d m xoig E uojje2yi edsedA Jeynuep E 1eyipoiy E T I n o s uinugjoe epau IS unu3jOJeulpors JO9uieNuunu3s JO po guunug3s T T uoniugequunu3 e up loog n 6uins a Bus sueu a Abbildung 10 Metamodell Teil 3 12 50 6unprieupsuedu uebaMsoep Dumn p g 349PUE aure ueqeu qe yneqebjne 216 puls epieg jeasqe aqupiu I E pl q puls uebaMsep 1iarizuejsul Lu Lu USuuoy SWEN pun ed Jyomos 3ueuinBaypae piiwopunogasddns 3ueuinfuyejduiisjOed Ls Buijs s
61. Listing 38 Steuern des AST Aufbaus in der Parsergrammatik Der Parsingvorgang beginnt mit dem Aufruf der Parsermethode welche den gleichen Namen wie das Start symbol tr gt 144 EI Grundlagen Abbildung 35 Resultierender AST der aus Listing 56 resultiert E 1 6 Regeln in der Treeparsergrammatik Neben der Erzeugung von Lexern und Parsern bietet ANTLR auch die Erzeugung von Tree parsern auch Treewalker genannt an Grunds tzlich gilt hier das gleiche wie f r die Parser grammat k allerdings traversiert der Treeparser einen AST anstelle eines Tokenstreams Eine Besonderheit der Treeparsergrammtik ist die Raute Eine Raute veranlasst einen Ab stieg im Baum Die Regel in Listing 39 match nur einen Knoten PLUS dessen ersten zwei Kinderknoten vom Typ INT sind Dabei muss der Vaterknoten immer ber eine Tokenreferenz identifiziert werden d h dieser muss urspr nglich ein Token im Parser zugrundeliegen Beim schreiben der Treeparsergrammatik muss deshalb bedacht werden mit welchen Strukturen der AST im Parser aufgebaut wurde expr PLUS INT INT Listing 39 Regel die einen Subbaum matcht E 1 7 Umsetzung der Grammatik in Javaquelltext Nicht nur die Grammatiken sollen gut lesbar sein sondern auch die erzeugten Parser sollen f r einen Entwickler m glichst nachvollziehbar sein Deshalb wurde ANTLR dahingehend optimiert Quelltexte zu erzeugen die auch ein Entwickler schreiben w rde wenn er einen Parser von H
62. S 7I S9 PSC TpT 69 t ldulo durreurogos rojoenxovaef 6907198 868 8b CP COP 217 9 6 Pl CO YE TYL 69 193829 Jdurrvurogos101enxoeAef SEI 99 1816 98 2912 6199 69 Azer Idurreurogos1ojoenxoeAef DER 9OL OET OZ IZ ECT CLL SE T 88889 OZ agoe qerersfzuargox map 066112 919 8II ISTZ ert 967 2 91 88889 ode dee gereil zuargox rg 181061 T6F911 99 81 9071 9 2 eer 88889 ode Azer gete toaut Y Graph m ing in s E e e Ee er E Q en 7 E e fing E Y as Q Gesamtdauer in s Dauer Graph speichern in s Anzahl der Quelltextzeilen Anzahl der Klassen Extraktormodus Softwareprojekt Anzahl der Kanten im Graph Dauer Resolv Anzahl der Knoten 41 6 Verwendung des Javaextraktors 8 Verwendung des Javaextraktors 8 1 Erzeugung Da der Extraktor teils als Quelltext und teils als ANTLR Grammatik vorliegt m ssen aus die sen einmalig die entsprechenden Programme erzeugt werden bevor eine Verwendung stattfin den kann Folgende Schritte m ssen dazu durchgef hrt werden 42 1 Im Folgenden wird die Verzeichnisstruktur verwendet die aus dem SVN Repository des Gupro Projektes siehe 19 stammt In ein lokales Arbeitsverzeichnis localrepository werden zun chst die drei Ver zeichnisse localrepository jgralab e localrepository commo
63. Seite 5 in 11 Weitere Details zu JGraLab finden sich ebenfalls in 11 Sourcecodebrowser Der Sourcecodebrowser ist eine Komponente der QGupro Benut zeroberfl che Er zeigt Quelltexte an und hebt Codeabschnitte hervor die das Ergebnis einer GReQL Anfrage sind F r mehr Informationen zum Sourcecodebrowser siehe 2 Token Ein Token ist ein atomares Eingabeelement f r einen Parser und wird von einem Le xer erzeugt Es repr sentiert eine erkannte Zeichenfolge in einem Zeichenstrom bspw Quell text blicherweise wird ein Token in einer Lexergrammatik definiert 1 1 Erkl rung der Begrifflichkeiten Lexer Ein Lexer ist ein Programm welches aus einem Zeichenstrom eine Folge von Tokens erzeugt Der Lexer ist in der Lage bestimmte Zeichen oder Zeichenfolgen zu erkennen Diese werden als Lexeme bezeichnet Aus jedem erkannten Lexem erzeugt der Lexer ein Token Ein Lexer kann durch eine formale Grammatik beschrieben werden Aus dieser kann automa tisiert ein Lexer erzeugt werden Parser Ein Parser ist ein Programm zur Syntaxanalyse Der Parser erkennt syntaktische Einheiten in einem Tokenstrom In der Regel liefert ein Lexer die Tokens Meist bildet der Parser die Syntax der Eingabedaten in einem abstrakten Syntaxbaum ab Auch ein Parser kann durch eine formale Grammatik beschrieben werden Aus dieser kann wiederum automatisiert ein Parser erzeugt werden LL Parser Bezeichnung f r einen Parsertyp LL Parser versuchen die Syn
64. UNIVERSITAT KOBLENZ LANDAU Fachbereich 4 Institut f r Softwaretechnik Java Faktenextraktor f r Gupro Studienarbeit vorgelegt von Arne Baldauf abaldauf uni koblenz de Nicolas Vika ultbreit uni koblenz de betreut von Prof Dr J rgen Ebert Institut f r Softwaretechnik Fachbereich 4 Dr Volker Riediger Institut f r Softwaretechnik Fachbereich 4 Koblenz im Januar 2008 Erkl rung Ich versichere dass ich die Kapitel 1 6 7 8 sowie die Anh nge A B D der vorliegenden Arbeit selbst ndig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe Mit der Einstellung dieser Arbeit in die Bibliothek bin ich einverstanden Der Ver ffentlichung dieser Arbeit im Internet stimme ich zu Ort Datum Unterschrift Erkl rung Ich versichere dass ich die Kapitel 2 3 4 5 9 sowie die Anh nge C E F der vorliegenden Arbeit selbst ndig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe Mit der Einstellung dieser Arbeit in die Bibliothek bin ich einverstanden Der Ver ffentlichung dieser Arbeit im Internet stimme ich zu Ort Datum Unterschrift Zusammenfassung Gupro soll Entwicklern im Rahmen der Softwarewartung bei Verst ndnis und Analyse von Softwaresystemen behilflich sein Gupro verwendet dazu TGraphen welche eine erheblich bessere Analyse erm glichen als d e zugrundeliegenden Quelltexte Diese TGraphen s nd typisierte attr butier
65. Zwischenspeicherung von Referenzen und Struk turinformationen des erzeugten TGraph Dies ist f r ein Aufl sen durch die Resolverklassen n tig Ebenso beinhaltet diese Klasse die Funktionalit t zum Speichern und Abrufen der Gra phelemente welche im Graph einzigartig sein sollen F r eine n here Beschreibung dieser Funktionalit t siehe Kapitel 7 3 1 Utilities Diese Klasse beinhaltet statische Hilfsmethoden welche in den anderen Klassen Verwendung finden Diese dienen dem F llen der Attibute von Kanten mit konkreten Werten sowie der Fehlerbehandlung ExtractionMode Dieser Enum Typ repr sentiert die Extraktionsmodi LAZY EAGER und COMPLETE F r eine n here Betrachtung siehe Kapitel 7 3 3 24 6 2 Package Javaextractor adapters JavaLexer Implementiert den Lexer und wird automatisiert von ANTLR aus der Gram matik in java g generiert JavaRecognizer Das Javaparsing ist in dieser Klasse realisiert welche von ANTLR aus der Grammatik in java g generiert wird Der Parser erzeugt aus jeder Datei die g ltigen Java Quelltext enth lt einen abstrakten Syntaxbaum und nutzt als Lexer jJavaextractor adapters JavaLexerAdapter JavaTokenTypes Diese Schnittstelle legt alle durch den Lexer erzeugten Tokenarten fest und wird auch mittels ANTLR aus der Grammatik generiert JavaTreeParser Diese Klassen wird von ANTLR aus der Treewalker Grammatik in java tree g erzeugt Dieser Treewalker dient der Traversierung von abstrakten Syntax b u
66. a Test15 lt A lt Integer gt gt foo x although the spec says this should work A lt Integer gt aa lt A lt Integer gt gt foo x Neal Gafter has assured me that this is a bug in the Spec Type arguments are only valid after a dot explicit parameters with constructor invocations prototype 2 2 chokes on this new String K Integer xh this new String K Integer xh static class A lt T gt T t C 7 Javaquelltexte f r Tests static class B static class C lt T gt extends A lt T gt static class D lt A B gt static class E lt X Y extends A lt X gt gt static interface F Wildcard bounds static class G A lt extends F gt a A lt super C lInteger b class H static class extends A lt Objeci gt 1 static class J extends A bytell class K Y lt T gt K T t Test15 lt T gt foo static lt T gt T foo return null Listing 9 Test15 ava Ara Diese Klasse ist ein Testquelltext fuer die Java 1 5 x Grammatik von CUP Das Original wird von CUP fehlerfrei geparst ist jedoch nicht mit javac kompilierbar x Nachdem wir einige Auskommentierungen vorgenommen x hatten wurde diese auch kommentarlos von javac x kompiliert Da diese Klasse recht komplexe Statements x enthaelt wird diese auch fuer die Parsingtests benutzt Dies ist jedoch mehr ein statistischer Test import static java lang Math x test of static
67. allen im Framework enthaltenen Tools handelt es sich um Komman dozeilenprogramme Zus tzlich existiert eine graphische Oberfl che f r die Benutzung der Kommandozeilenwerkzeuge unter Eclipse ANTLR Studio genannt Allerdings stammt es von einem Dritten und ist kostenpflichtig Deshalb gehen wir im Weiteren nur auf die Komman dozeilenverwendung ein Zur Erzeugung der Lexer und Parser muss ANTLR mit einer Grammatik als Parameter auf gerufen werden Die so erzeugten Lexer und Parser m ssen dann zur Verwendung in einem separaten Programm eingebaut werden Dabei ben tigen diese weiterhin ANTLR zur Lauf zeit Eigene Erfahrungen ANTLR wird in der Javaversion wahlweise in einem vorkompi lierten JAR Paket oder als Quelltextversion geliefert Die Installation durch ein Setup Programm verlief fehlerfrei und wir konnten direkt mit der Erzeugung der Parser beginnen Rund um die ses Projekt existiert offensichtlich eine vergleichsweise gro e und aktive Community Dieser entstammen auch die drei Grammatiken f r Java 1 5 welche wir im weiteren gestestet ha ben Die Erzeugung und Kompilierung des jeweiligen Lexers und Parsers aus den beiden Javagram matiken von Michael Stahl und Michael Studman verlief fehlerfrei so dass wir mit einem auf der Homepage verf gbaren Beispielprogramm die Parsingtests durchf hren konnten Die dritte verf gbare Grammatik von Scott Wisniewski baut auf der von Studman auf Sie soll die volle Spanne der Java Identif
68. alls ber die globale Variable currentVertex und diese erzeugt die entsprechenden Kanten z B vom Typ IsParameterOfMethod Mit der beschriebenen Vorgehensweise funktioniert die komplette Erzeugung der grundle genden TGraph Strukturen da die entsprechende Funktionalit t durchg ngig in allen Regeln implementiert ist 7 2 Sammeln und Berechnen der Positionsinformationen Durch die bereits in Abschnitt 4 3 beschriebenen Anpassungen ist es m glich im Treewalker Positionsinformationen zu den einzelnen Elementen des ASTSs abzufragen und zu verarbeiten Somit konnte das Berechnen und Speichern der jeweiligen Attribute in den TGraph imple mentiert werden Die implementierte Funktionalit t ist in den relevanten Treewalker Regeln enthalten und hnelt im Prinzip der Generierung der einzelnen Elemente des TGraphen 1 Nach jeder referenzierten Unterregel wird das zur ckgegebene Anfangs und End AST Element abgerufen und daraus die Positionsinformationen sowie die Gesamtl nge be rechnet Diese werden in die Kante eingetragen welche den von der Regel zur ckgege benen Knoten mit anbindet bei einer Listenregel nicht 2 Am Ende der Regel wird das eigene Anfangs und End AST Element zur ckgegeben Dabei handelt es sich entweder um das erste letzte Element aus den Unterregeln oder um eventuell in der Regel direkt vorhandene AST Elemente 35 7 Funktionsweise des Javaextraktors F r die Ermittlung werden zwei globale Variablen verwendet
69. ammen einen javabasierten Prototypen erstellen Der umgekehrte Weg ist eben falls m glich sprich Java Quelltexte zu parsen und bis zu einem gewissen Grad in UML Diagramme umsetzen zu k nnen Dabei wird auch die Verwendung von Patterns durch eine eigene Spezifikationssprache unterst tzt F r uns ist allerdings lediglich der als PlugIn realisierte Javaparser von Bedeutung Bisher kann dieser nur Javaquelltexte bis Java 1 4 parsen und den dazugeh rigen AST aufbauen Parsing von Java 5 Quelltexten ist geplant aber noch nicht in Arbeit Literatur Auf der Homepage siehe 30 von FUJABA existiert eine ausf hrliche Doku mentation zu dessen Verwendung f r Entwickler existieren hingegen nur eine API Beschreibung von FUJABA und ein paar Eintr ge im Wiki Bei Fragen kann man sich an eine Mailingliste wenden Verwendung Der Parser muss in ein separates Programm eingebunden werden welches die Bereitstellung der Eingabedaten und das AnstoDen des Parsings bernimmt Eigene Erfahrungen Durch Ausprobieren und Entpacken der PlugIn Packages von Fuja ba haben wir herausgefunden dass sich FUJABA einer freizug nglichen JavaCC Grammatik bedient Aus dieser wurde erst mit jtb Java Tree Builder siehe 31 eine weitere Grammatik und Klassen f r einen AST erzeugt Aus der neuen Grammatik wurde schlie lich mit JavaCC der Parser generiert der den AST aufbaut Dar ber hinaus existiert ein FUJABA PlugIn welches JavaAST heisst und auf dem AST ar
70. and programmieren m sste Schaut man in die erzeugten Lexer Parserquelltexte 145 E Detaillierte Funktionsweise von ANTLR Abbildung 36 Beispiel AST der von der Regel aus Listing 59 erwartet wird hinein kann man leicht nachvollziehen wie ANTLR die Regeln der Grammatik in Quelltext hier 1n Java umsetzt Zu jedem beschriebenen Element folgt ein Beispiel Auf der linken Seite steht die Grammatik und auf der rechten der daraus erzeugte Quelltext Das jeweils thematisierte Element ist auf beiden Seiten farblich hervorgehoben Operatoren Regeln Jede Regel wird zu einer Methode die final und standardm ig public ist Dabei dient der Regelname als Methodenbezeichner Eine Regelreferenz wird zum Aufruf einer Methode und eine Tokenreferenz weist den Lexer mit match Token an dieses zu erkennen Dazu kommen noch Exceptions die aber erst im n chsten Abschnitt behandelt wer den Der bersichtlichkeit halber werden in den Quelltexten der folgenden Paragraphen die Mo difizierer weggelassen Der Leser sollte aber immer im Hinterkopf behalten dass diese immer von ANTLR erzeugt werden X public final void a match A j Abbildung 37 Umsetzung einer einfachen Regel Exceptions Grunds tzlich gibt ANTLR jeder Methode die aus einer Regel entstammt mehrere Exceptions mit Im Lexer sind dies RecognitionException 146 EI Grundlagen e CharStreamException e TokenStreamException Im Parser sind dies e Re
71. apeSequences Unicode Escapesequenzen AllowedGenericConstruct Erlaubter generic Ausdruck aus Java 5 6 AllowedForEachConstructs Erlaubter ForEach Ausdruck aus Java 5 AnotherAllowedForEachConstruct Erlaubter ForEach Ausdruck aus Java 5 n Test15 Komplizierte Kombinationen von Java 5 R TestJSR201 Berichtigt Komplizterte Kombinationen von Java 5 10 Tabelle 4 Kurze Beschreibung der Quelltexte f r erste Parsingphase 86 C 2 Parsergeneratoren Testquelltexte Inhalt ForEachInShouldGiveParseError Nicht mehr erlaubter ForEachIn 13 AbstractEnumShouldGiveParseError Nicht erlaubter abstarkter Enum 11 AbstractFinalShouldGiveParseError Ung ltige Kombination von abstract und 12 final 4 PublicPrivateShouldGiveParseError Ung ltige Kombination von public und private Tabelle 5 Kurze Beschreibung der Quelltexte f r zweite Parsingphase Testquelltexte Inhalt TestsPositionsLinux Newlines Linux TestsPositionsMac Newlines Mac TestsPositionsWindows Newlines Windows TestZeilenumbrueche ASCII Kombination der Newlines Datei ASCII kodiert Tabelle 6 Kurze Beschreibung der Quelltexte f r dritte Parsingphase C 2 Parsergeneratoren Bei einem Parsergenerator handelt es sich um ein Programm welches aus einer Grammatik einen Parser erzeugt der die Sprache die in der Grammatik beschrieben wird parsen kann Da wir einen Parser f r Java ben tigen werden in diesem Abschnitt die in Frage kommenden Par
72. arsingtests Parser nach Grammatik von Michael Stahl Alle Testquelltexte mit fehlerfreien Konstrukten wurden von diesem Parser akzeptiert ausgenommen diejenigen wel che enum Konstrukte enthalten Offensichtlich ist die vorhandene Grammatik nicht vollst n dig und erkennt diesen Ausdruck nicht Das ung ltige for each in wurde korrekterweise nicht akzeptiert alle un g ltigen und widerspr chlichen Modifier wurden allerdings f lschlicherweise akzeptiert Die Quelltexte mit problematischen Zeilenumbr chen wurden fehlerfrei erkannt Eine bersicht zu den Testergebnissen findet sich in Tabelle 15 Parsingtests Parser nach Grammatik von Michael Studman Alle Testquelltexte mit fehlerfreien Konstrukten wurden von diesem Parser akzeptiert im Gegensatz zur Gram matik von Stahl auch solche mit enum Ausdr cken Die restlichen Ergebnisse sind identisch Das ung ltige for each in wur de korrekterweise nicht akzeptiert alle ung ltigen und widerspr chlichen Modifier wurden falschlicherweise akzeptiert Die Quelltexte mit problematischen Zeilenumbr chen wurden fehlerfrei erkannt Eine bersicht zu den Testergebnissen findet sich in Tabelle 16 C 3 Werkzeuge die Parsergeneratoren benutzen In diesem Abschnitt werden Tools untersucht welche auf einen Parsergenerator aufbauen oder mit einem durch einen Generator erzeugten Parser arbeiten und daf r eigene Java Grammatiken mitbringen 100 C 3 Werkzeuge die Pa
73. as Metamodell soll eine statische Repr sentation des Quelltextes erm glichen Das heisst dass die TGraphen kein Laufzeitverhalten abbilden sollen 3 Das Metamodell soll alle Javasprachversionen bis einschlieBlich 5 abdecken und die Speicherung der Positionen der identifizierten Elemente im Quelltext erm glichen 5 3 Metamodell von Hinterwaller Ein Metamodell f r Java 1 4 und die dazu passende Grammatik f r Java existierten bereits am Institut f r Softwaretechnik Diese waren im Rahmen der Diplomarbeit 10 von Bodo Hin terw ller entstanden Es bestand die Hoffnung dass dieses Metamodell an die Anforderungen dieser Studienarbeit angepasst werden k nnte Das Metamodell basierte auf den Java Deve lopment Tools von Eclipse f r Java in der Version 1 4 Es musste daher f r Java 5 aktualisiert werden Diese Anpassung wurde vorgenommen doch im Zuge dieser berarbeitung wurde offensichtlich dass eine Verwendung dieses Modells nicht in Frage kommt Zuvor war nach einer umfangreichen Onlinerecherche zu m glichen Javaparsern die Wahl auf den Parsergenerator ANTLR in Version 2 7 6 und einer passenden Grammatik f r Java 5 ge fallen Der erzeugte Parser sollte das Parsen der Javaklassen f r den Faktenextraktor berneh men Aufgrund der Basierung auf den Java Development Tools von Eclipse unterschied sich die Grammatik von Hinterw ller zu sehr von jener f r ANTLR Eine Verwendung des Meta modells von Hinterw ller h tte somit die Ent
74. ation des Codes auch h here Abstraktionsniveaus abdecken Partiell erf llt nur das feingranulare Schema wurde umgesetzt 3 SOLLTE Der Faktenextraktor soll als eigenst ndiges Programm lauff hig sein nach M glichkeit als Commandline Utility Erf llt 4 OPTIONAL F r die Arbeit mit TGraphen sollen einige sinnvolle Beispielanfragen in GReQL formuliert werden welche auf die objektorientierte Ausrichtung von Java abzielen Nicht erf llt 5 MUSS Die Positionen der identifizierten Elemente im Quelltext m ssen Gupro konform im TGraph mitgespeichert werden zwecks Nutzung durch den graphenbasierten Source codebrowser Erf llt 2 Anforderungsliste Javaextraktor SOLLTE Der Faktenextraktor soll m glichst fehlertolerant sein D h syntaktisch feh lerhafter Java Code sollte durch Ignorieren oder Auslassen nicht zum Fehlschlagen des kompletten Parsingvorgangs f hren Nicht erf llt Die verwendete Javagrammatik lie dies nicht zu MUSS Der Faktenextraktor muss Quelltextreferenzen aufl sen k nnen Erf llt OPTIONAL Der Faktenextraktor soll nur Code feingranular m TGraph repr sentieren welcher als Quellcode vorliegt von referenziertem Code welcher nur in class oder n jar Dateien ohne Quelltext vorliegt m ssen mittels Reflexion lediglich die Signaturen extrahiert werden Erf llt 2 2 Nichtfunktionale Anforderungen Die nichtfunktionalen Anforderungen legen die weiteren Eigenschaften de
75. aveGraph Tobias String woid uses venumerations ExtractionMode Uses enumo LAZY EAGER COMPLETE 1 EMEN SE ge al A 1 d Charscanmerdd anter Jawalexer JavaLlexerAdaptenLexerSharedinputstate newline woid BEEN 1 addTeFullyQualifiedMame Vertex ASTI void 0 bei 2 eee i copyEdgeAttributes AttributedEdge AttributedEdge void 1 y 1 fillEdgeAttributezCammonASTAdapter amp ttributedEdge void Symbol Table fillEdgeAttributesFramAS Ti amp tributedEdge AST void fillEdgeAttributesF om AS T Difference amp ttributedEdge AST AST void fillEdgeXttributeszWith SivenValuelAtributedEdge int void stackT race ToStinglException Strin addintegerConstant String IntegerCanstant void addJavaPackage String Javafackage void addhMaodifiemhadifiers Madifier waid addTypeDetinition String Type woid gett raphi Java getintegerConstant String IntegerConstant getlawaP ackage String JavaFackage gethiodifiemhMoadifierz Modifier getHulli Mull getTypeDetinition String Type hasEmptyStatement boolean hasintegerConstant String boolean hasJavaPackagelString boolean hasMadifiemhadifierz boolean hazHull boolean hasTypeDetinition String boolean nextF ile woid reset void setEmptyStatementiEmptyStatement void setHulliMulli woid SymbolT ableilavady Abbildung 3 Klassendiagramm
76. beitet Zwar kann man sich die Quelltexte von der Homepage herunterladen doch leider sind gerade die Quelltexte dieses PlugIns nicht frei zug nglich Auf Nachfragen in der Mailing list wurde uns mitgeteilt dass ein Zugriff auf den CVS Server zwar grunds tzlich m glich sei allerdings ist auch hier dieses PlugIn ausgeschlossen da es im Moment Gegenstand der Forschung sei Es gelang uns zwar den Parser zu erzeugen aber nicht zu kompilieren Auch die Verwendung des bereits kompilierten Parsers aus den FUJABA Binaries gelang uns nicht 106 C 4 Quelloffene Java Compiler Implementationen Auf eine weitere Anfrage hin erfuhren wir dass der erzeugte AST nicht vollst ndig ist da dieser lediglich die Methodenr mpfe enth lt sowie in der Darstellung der Ausdr cke stark vereinfacht ist Alle weiteren Informationen wie etwa die Methodenk pfe oder Klassen wer den nicht im AST sondern im verwendeten UML Modell gespeichert so dass eine weitere Betrachtung und weitere Tests f r dieses Tool entfallen Position amp L nge der Token im Quelltext Da es sich um eine JavaCC Grammatik handelt gilt auch hier alles was bereits im Abschnitt JavaCC geschrieben wurde Parsingtest Entfallen da Parser nicht zu benutzen war Rechercheergebnis Tabelle 20 bersicht FUJABA C 4 Quelloffene Java Compiler Implementationen Da auch beim Kompilieren ein Parsing notwendig ist haben wir die nachfolgenden quellof fenen Java Compiler hinsichtlich der
77. bildung 26 Kantentypenhierarchie Teil 7 13 66 aymyoApoadooss 1 E JoApogdoo1s Ey 10330 pogdoo7s1 2 CH uoisso1dxaxyu E Jo p spueHiybiys uoisse1dxaxiisodjOepispueneTs E uoisseJdxaxyu goepispuengersi 2 JOepispuegyersi Abbildung 27 Kantentypenhierarchie Teil 8 13 67 A Metamodell der Graphklassen pierquoneyouuyjoJeupoys JoyourejeqjoJouipors E S qeneyyossy pows E POUPWOSUIPOWS E Joynasuo5joJeuripows E Joley pows uoneyouuyjoseuipows E unuajoJeuipoys seH u yoray pons sserogo sipoyisi Abbildung 28 Kantentypenhierarchie Teil 9 13 68 pogjo1ueue3exss esejynejegjo1ueuiegegss ese5joueuieeass JO9S 3S e JOU9YLS e JO3ueurejejss punoduio5o1ueure3egss Abbildung 29 Kantentypenhierarchie Teil 10 13 69 A Metamodell der Graphklassen IsReturnTypeof o IsTypeOfParameter Q IsTypeOfVariable o IsQualifiedTypeOf o IsTypeof o IsTypeOfSimpleArgument o IsTypeOfCreatedArray o IsElementTypeOf IsCastedTypeof IsCastedBuiltInTypeOf IsElementTypeOfCreatedArray Abbildung 30 Kantentypenhierarchie Teil 11 13 70 esne 5pu ea404JO 93euiejeds e 4032nu3su05JOJ93euueJe
78. c eil 54 e b e new B 55 Listing 4 Eric java il 113 C Dokumentation der Onlinerecherche Diese Klasse enthaelt Escapesequenzen x Stammt urspruenglich aus Testquelltexten fuer die Java x 1 5 Grammatik von CUP class EscapeSequences char u0009 oo nN Nn LA Listing 5 EscapeSequences java empty j AllowedGenericConstruct lt Integer gt B lt Integer gt c Listing 6 AllowedGenericConstruct java import java io x 2 kk 3 x Diese Klasse benutzt ein ForEach Konstrukt welches in der a x endgueltigen Fassung von Java 5 erlaubt ist s public abstract class AllowedForEachConstructs 6 s public void printArray d d 10 int iaa new int 10 10 H for int ia iaa 12 13 for int i ia 14 15 System out print i 114 C 7 Javaquelltexte f r Tests YY Listing 7 AllowedForEachConstructs java import java io x 2 kk l x Diese Klasse benutzt ein ForEach Konstrukt welches in der 4 x endgueltigen Fassung von Java 5 erlaubt ist seihe si x http Java sun com developer technicalArticles releases e x J2se15langfeat 7 public void newFor Collection lt String gt c 11 12 for String str 13 14 sb append str Listing 8 AnotherAllowedForEachConstruct java i A valid JSR 14 Java program which illustrates some 2 x COrner cases in the smart lexer lookahead implemen
79. chen Generalisierungen Beispiel siehe Abbil dung 45 und 46 Verk rzung der Wege im Diagramm durch Verwerfung von Klassen die Samm lungen repr sentieren Ersetzung dieser mit entsprechenden Kardinalit ten an den vorher in den Sammlungen zusammengefassten Klassen Beispiel siehe Abbil dung 47 und 48 e treffender bezeichnend Vergabe von aussagekr ftigen Bezeichnern in Anlehnung an die allgemeinen Java programmiertermini und die in der Vorlesung Programmierung gelehrten Re geln Z B die Kantennamen in Abbildung 49 160 EI Vorgehensweise 2112 TraditionalForClause x isl teratorOf 2119 Expression Abbildung 48 berarbeitetes Modell des TraditionalForClause nach Heuristiken aus Abschnitt F 1 3 la DoWhileStatement isConditionOf isLoopBodyOf 1 1 ll S Expression 2112 Statement Abbildung 49 berarbeitetes Modell des DoWhileStatement nach Heuristiken aus Ab schnitt F 1 3 F 1 4 Weitere berarbeitung V4 Im n chsten Schritt wurden fast alle brigen Klassen unter konsequenter Anwendung oben angef hrter Heuristiken berarbeitet Hinzu kam dass im gesamten Metamodell alle Aggregationen durch einfache Assoziationen mit Adjektiven als Kantennamen ersetzt wer den mussten Dies war n tig f r die sp tere Bearbeitung der resultierenden TGraphen Die Heuristiken aus Abschnitt F 1 1 welche die Rollen betreffen sind somit berfl ssig Eine direkte Umsetzung in einfache Assoziati
80. chreibung des Frameworks und zus tzlichen Ver ffentlichungen von teils wissenschaftlichen Arbeiten zum Thema Compilerbau zur Verf gung Fragen die dar ber hinausgehen k nnen in Foren sowie in einer Mailingliste gestellt werden Rund um dieses Projekt existiert eine grobe und aktive Community Dieser entstammen u a die Grammatiken f r Java 5 4 2 Funktionsweise von ANTLR Der Parsergenerator von ANTLR erzeugt aus einer Grammatik einen Parser Im Gegensatz zu den meisten anderen Generatoren kann ANTLR jedoch ohne Umwege auch zum Parser passende Lexer und Treeparser erzeugen Es ist dazu nicht n tig weitere Zusatzprogramme zu Hilfe zu nehmen wie es beispielsweise bei CUP 25 der Fall ist Grunds tzlich gilt dass f r Lexer Parser und Treeparser jeweils eine Grammatik geschrieben werden muss Dabei kann der Benutzer frei w hlen welche er realisieren will Braucht er beispielweise nur einen Lexer so muss er nur die Lexergrammatik schreiben Da ANTLR dem Paradigma der Objektorientierung folgt ist es auch m glich die Grammatiken weiter zu vererben Bei allen im Framework enthaltenen Werkzeugen handelt es sich um Kommandozeilenpro gramme Zur Erzeugung der gew nschten Programme m ssen die Grammatiken per Kom mandozeilenparameter an ANTLR bergeben werden Die so erzeugten Lexer und Parser sind im Quelltext vorliegende Komponenten und k nnen zur Verwendung in separaten Program men eingebunden werden Dabei werden zur La
81. cognitionException e TokenStreamException Es kann jedoch sein dass in dieser Methode keinerlei Exceptions ausgel st werden In diesem Fall sind o a Exceptions in der Methodendeklaration noch aufgef hrt es existiert im Metho denrumpf aber kein throw Statement In Abbildung 38 ist dies der Fall MyException muss in einer semantischen Aktion manuell ausgel st werden Der bersichtlichkeit halber werden in den Quelltexten der folgenden Paragraphen die throws Klauseln weggelassen Der Leser sollte aber immer im Hinterkopf behalten dass diese trotz dem immer von ANTLR erzeugt wird a throws MyException A void a throws RecognitionException TokenStreamException MyException match A j Abbildung 38 Umsetzung einer Regel die eine Exception ausl sen kann Sichtbarkeit einer Regel Der Sichtbarkeitsmodifizierer wird unver ndert als solcher in den Quelltext bernommen Ist in der Grammatik keiner angegeben wird standardm ssig public verwendet private a A private final a match A j Abbildung 39 Umsetzung einer Regel mit Sichtbarkeitsmodifizierer Semantische Aktion Diese wird unver ndert in den Quelltext des Zielprogramms ko piert und muss deshalb auch in der Zielsprache formuliert werden 147 E Detaillierte Funktionsweise von ANTLR fint Le Ls int a int ipitiscint 75 Abbildung 40 Umsetzung einer semantischen Aktion Semantisches Pr dikat Die Bedingung in einem semantischen Pr
82. currentBeginAST und currentEndAST Mit Ausnahme der Kanten unter denen sich keine zusammengesetzte Struktur befindet findet die beschriebene Funktionalit t im Treewalker durchgehend Ver wendung 7 3 Aufl sen der Quelltextreferenzen Nach dem Durchlaufen eines AST ist dessen Struktur im wesentlichen in einen TGraph umge setzt Der TGraph soll die Syntax der Quelltexte jedoch in Form eines ASG repr sentieren Im Gegensatz zum AST sind bestimmte Knoten einzigartig und Schleifen erlaubt Grunds tzlich soll im Graphen jeder Knoten der eine Typspezifikation einen Methoden Konstruktoraufruf oder einen Feld Variablenzugriff repr sentiert ber eine Kante mit dem Knoten verbunden sein welcher die entsprechende Definition bzw Deklaration repr sentiert Das Aufl sen von Referenzen umfasst neben dem Ermitteln der spezifizierten Typen Typparameter Variablen Label und Methoden auch eine entsprechende Anpassung des Graphen 7 3 1 Genereller Ablauf des Aufl sevorgangs Zun chst werden w hrend der Ausf hrung des Treewalkers jene Knoten in der Symboltabelle gesammelt die f r das Aufl sen der Referenzen von Bedeutung sind Dies sind Knoten die eines der folgenden Elemente im Quelltext repr sentieren e Typdefinitionen e Typspezifikationen e Parameterdeklarationen e Variablendeklarationen e Variablenzugriffe dies beinhaltet auch Zugriffe auf Felder Parameter und Enum Werte e Methodendeklarationen und definitionen e Konstrukto
83. d Kanten im Graph erzeugt und initiali siert Zus tzlich wird eine leere Symboltabelle erstellt F r jede Quelltextdatei 1n der Liste werden die folgenden Schritte abgearbeitet e Der Parser erzeugt einen AST aus der Datei e Im TGraph werden die entsprechenden Verwaltungsinformationen f r die Datei erzeugt e Dem Treewalker wird der AST der TGraph die Symboltabelle sowie einige wei tere Objektreferenzen bergeben Der Treewalker traversiert den AST und generiert dabei die entsprechenden Ele mente im TGraph in einer dem Metamodell entsprechenden Struktur Ebenso wer den weitere Objektreferenzen gesammelt und zur Symboltabelle hinzugef gt e Innerhalb der erzeugten Teilstruktur des TGraph werden lokale Typreferenzen und Variablenzugriffe aufgel st und die entsprechenden Kanten erzeugt Dabei seman tisch identische mehrfach vorkommende Knoten werden zu einem einzigen Kno ten zusammengef hrt ber die gesamte Struktur des Graphen werden Typreferenzen Variablenzugriffe und Methodenaufrufe aufgel st entsprechende Kanten erzeugt und wiederum semantisch identische mehrfach vorkommende Knoten verschmolzen Sind Elemente auch dabei nicht aufl sbar so wird in Abh ngigkeit vom eingestellten Modus mittels der Reflection Funktionalit t von Java eine Aufl sung versucht Der TGraph wird in einer Datei abgespeichert dabei wird der bergebene Pfad und Dateiname verwendet Existiert die Datei bereits so wird diese
84. dEdge from Expression 1 1 to ConditionalExpression 1 1 N N 233 234 VertexClass BuiltinCast Expression 25 EdgeClass IsCastedBuiltInTypeOf IsTypeOf from BuiltInType 1 1 to BuiltlnCast 1 1 N 3 EdgeClass IsCastedValueOf AttributedEdge from Expression 1 1 to BuiltlnCast 1 1 247 s VertexClass ClassCast Expression 3 EdgeClass IsCastedTypeOf sTypeOf from TypeSpecification 1 1 to ClassCast 1 1 N o2 N al EdgeClass IsCastedObjectOf AttributedEdge from Expression 1 1 to ClassCast 1 1 N 241 212 VertexClass InfixExpression Expression operator InfixOperators 79 24 LA 24 a 245 247 248 24 250 251 252 253 Schema der Graphklassen EdgeClass IsLeftHandSideOfInfixExpression IsLeftHandSideOf from Expression 1 1 to InfixExpression 1 1 EdgeClass IsRightHandSideOfInfixExpression IsRightHandSideOf from Expression 1 1 to InfixExpression 1 1 VertexClass PrefixExpression Expression f operator PrefixOperators EdgeClass IsRightHandSideOfPrefixExpression IsRightHandSideOf from Expression 1 1 to PrefixExpression 1 1 VertexClass PostfixExpression Expression operator PostfixOperators EdgeClass IsLeftHandSideOfPostfixExpression IsLeftHandSideOf from Expression 1 1 to PostfixExpression 1 1 VertexClass Null Expression 254 VertexClass BooleanConstant Expression valu
85. dass die gesamte Funktionalit t des Javaextraktors auch diese Version abdeckt 1 Einf hrung und Motivation e gerichtet Kanten besitzen eine Richtung e angeordnet die Menge der mit einem Knoten verbundenen Kanten besitzt eine Ord nung 1 2 n te Kante Desweiteren gilt dass eine Kante nur zwischen zwei Knoten aufgespannt sein darf T Graphen k nnen zyklisch sein Eine formale Definition und weitergehende Beschreibung findet sich auf den Seiten 52 54 n 6 GReQL GReQL steht f r Gupro Repository Query Language und ist eine Anfragesprache f r TGraphen die in Gupro Verwendung findet Abgefragt werden k nnen e Inhalte z B Attributwerte von Kanten und Knoten e Strukturen im TGraph e Aggregierte Informationen z B Anzahl von Knoten oder Kanten eines bestimmten lyps e beliebige Kombinationen aus den drei zuvor genannten F r die Formulierung einer Anfrage ist die Kenntnis des Schemas Metamodells des an geftragten TGraphen notwendig Details zu GReQL finden sich u a auf den Seiten 173ff in 6 sowie f r die aktuelle Version GReQL 2 in 3 und 12 JGraLab Das zuvor in C implementierte Graphenlabor wurde in Java als JGralab neuim plementiert und ist Teil des Gupro Projekts Das Graphenlabor bietet eine Klassenbiblio thek um TGraphen als interne Datenstruktur effizient benutzen zu k nnen Diese API bietet Traversierungs und Manipulationsm glichkeiten f r TGraphen und ihr Typsystem an vel
86. den Es bleibt dem Benutzer berlassen herauszufinden wie die Grammatiken bersetzt und getes tet werden k nnen Verwendung Auch CUP ist ein Kommandozeilenwerkzeug Als Aufrufparameter wird diesem unter anderem der Pfad zur Grammatik mitgeteilt die in einen Parser bersetzt wer den soll Der so erzeugte Parser muss dann in einem anderen Programm zusammen mit einem Lexer aufgerufen werden Vorher muessen dem Lexer noch die zu parsenden Eingabedaten mitgegeben werden Der Parsingvorgang wird dann durch den Parser der zur Laufzeit weiter hin CUP ben tigt initiiert Eigene Erfahrung Schon das Einrichten von CUP funktionierte nicht so reibungslos wie es die Dokumentation suggerierte F r Linuxsysteme wird ein Shellskript mitgeliefert dass die Installation bernehmen soll Leider brach es mit einer Fehlermeldung ab Da CUP in unkompilierten Quelltexten geliefert wird gelang uns die Kompilierung und das Erg nzen der CLASSPATH Umgebungsvariablen schlie lich von Hand 91 C Dokumentation der Onlinerecherche Die Erzeugung eines Parsers aus einer Beispielgrammatik einfacher Taschenrechner gelang wie im Benutzerhandbuch beschrieben ber die Benutzung dieses Parsers schweigt sich die Dokumentation allerdings aus Wir konnten diesen zwar starten fanden aber nicht heraus wie dieser zu bedienen ist Einzig eine reproduzierbare Fehlermeldung lie sich dem Programm entlocken nach zweimaliger Eingabe eines arithmetischen Ausdrucks
87. den jedoch beim Aufl sen per Reflection immer komplette Graphrepr sen tationen erzeugt F r jede hinzukommende Referenz wird eine komplette Repr sentation der Klasse im Graphen erzeugt au er wenn diese bereits vorhanden ist Zus tzlich m ssen die da durch hinzukommenden Referenzen selbst wieder aufgel st werden Da dieser Vorgang rekur s v abl uft und nicht vorhersehbar ist wie viele Referenzen in den externen Klassen aufgel st werden m ssen kann dies u U sehr lange dauern Dieser Modus sollte benutzt werden wenn externe Klassen bei der Analyse des Softwarepro Jekts von Interesse sind 7 4 Aufwandsbetrachtung Die Dauer des Extraktionsprozesses und die Gr e des extrahierten Graphen h ngen von der Gr e des zu parsenden Softwareprojektes ab Dazu wurden verschiedene Softwareprojekte geparst und dabei die Anzahl der Quelltextzeilen gez hlt sowie die ben tigte Ausf hrungs dauer und die Gr be des Graphen festgehalten Geparst wurden die Quelltexte von ANTLR JGraLab und Packages des Javaextraktors die das Schema realisieren javaextractor schema und nochmals separat javaextractor schema impl Jedes Softwareprojekt wurde in allen drei Modi jeweils zwei Mal geparst und der durchschnitt liche Zeitaufwand ermittelt Tabelle 3 listet die gemessenen Werte f r die Extraktionsmodi LAZY EAGER und COMPLETE auf 22 Alle Messungen wurden auf einem AMD Athlon64 3200 mit 2GB RAM unter Windows XP vorgenommen 39 7 Funktion
88. die Entsprechung im Quelltext desjenigen Knotens beziehen von dem die Kante ausgeht Alle Kantentypen welche einen semantischen Bezug zwischen zwei Knoten abbilden besit zen diese Attribute nicht und basieren auf dem Kantentyp Edge aus JGraLab Die Kantenty pen sind ebenfalls in Anhang A zu finden 23 6 Entwurf 6 Entwurf In diesem Kapitel wird die Architektur des Javaextraktors beschrieben Aufgrund der gebote nen Trennung der Belange ist das Programm in verschiedene Klassen und Packages unterteilt welche im Folgenden beschrieben sind 6 1 Package javaextractor Dieses Package enth lt die Hauptkomponenten des Javaextraktors Dies sind folgende Klas sen JavaExtractor Diese Klasse enth lt die main Methode die zum Programmaufruf be n tigt wird Sie beinhaltet die Funktionalit t zur Auswertung der bergebenen Kommando zeilenargumente und zur Erstellung der Liste der zu verarbeitenden Dateien Desweiteren in stanziiert diese Klasse den verwendeten Logger und den eigentlichen Graphbuilder GraphBuilder Der GraphBuilder sorgt f r den Ablauf des eigentlichen Extraktionsprozes ses Die Klasse instanzitert und initialisiert einen leeren TGraphen eine leere Symboltabelle den Lexer Parser und Resolverklassen zum Aufl sen der Quelltextreferenzen Dann arbeitet die Klasse die Liste der zu parsenden Dateien ab Zuletzt sorgt sie f r die Speicherung des TGraphen in eine Datei SymbolTable Die Symboltabelle dient zur
89. diese wiederverwendet Zum Beispiel wird f r jede Verwendung einer Klasse im Quelltext ein Knoten vom Typ QualifiedType erzeugt Wird diese Typspezifikation zum ersten Mal aufgel st so wird I In Java ber Reflexion 37 7 Funktionsweise des Javaextraktors dieser Knoten in der Symboltabelle als aufgel st gef hrt und kann wiederverwendet werden Bei der n chsten Aufl sung der gleichen Klasse wird dann auch der selbe Knoten aus der Sym boltabelle verwendet und der berfl ssige Knoten gel scht Zuvor werden jedoch alle Kanten des zu l schenden Knotens umgehangen Im Falle von Methodenaufrufen und Variablenzugriffen wird sichergestellt dass die verbun denen Identifier Knoten einzigartig sind Die jeweiligen MethodInvocation und FieldAccess Knoten bleiben unver ndert da bei jedem Methodenaufruf andere Argumen te bergeben werden k nnen oder bei jedem Zugriff auf eine Array Variable auf ein anderes Element des Arrays zugegriffen werden kann 7 3 3 Aufl semodi Der Javaextraktor kann wahlweise mit drei verschiedenen Aufl semodi benutzt werden Sie unterscheiden sich in der Tiefe des Aufl sens externer Typen ihrer Felder und Methoden Externe Typen sind daran erkennbar dass das Attribut external auf t rue gesetzt ist Kno ten die Felder Methoden und Konstruktoren repr sentieren besitzen dieses Attribut nicht F r sie gilt der Wert des Attributs des Typdefinitionsknoten an dem sie h ngen Der Knoten der Typd
90. dikat wird als Bedin gung in eine i f Klausel kopiert Auch hier muss diese Bedingung deshalb in der Zielsprache formuliert werden In Abbildung 41 ist die Bedingung mit LA 1 ID kurzschlussverundet Befindet sich bei einem Lookahead von 1 kein Token ID so tritt keine der beiden Produktio nen ein sondern ein Fehlerfall stat isTypeName LT 1 if LA 1 ID amp amp isTypeName LT 1 ID ID ID ID ID expr else if LA 1 ID ID expr j else Fehler j Abbildung 41 Umsetzung eines semantischen Pr dikats Eingabe amp Ausgabeargumente Die Eingabeargumente einer Regel werden zu den Eingabeargumenten der daraus erzeugten Methode Das Ausgabeargument wird zum R ckga beargument der Methode Da eine Methode nur ein Argument zum R ckgabezeitpunkt aus geben kann ist auch nur ein Ausgabeargument erlaubt In Abbildung 42 wird in der Regel mexpr der Eingabewert dem Ausgabeargument per semantischer Aktion zugewiesen mexpr int x returns int value 0 public int mexpr int x value x int value 0 value x returnvalue j Abbildung 42 Umsetzung von Ein amp Ausgabeargumenten 148 E 2 Ein Beispieltaschenrechner E 2 Ein Beispieltaschenrechner In diesem Abschnitt sollen einige der zuvor kennengelernten Sprachelemente in einem Bei spiel veranschaulicht werden Dazu soll ein Taschenrechner f r arithmetische Ausdr cke wel che nur Addition Subtraktion Mult
91. doch ist dar ber 1 d R nur die Steuerung des Lexers wie etwa Behandlung von erst zur Laufzeit erkennbaren Sonderf llen sinnvoll Ferner d rfen Lexerregeln keine benutzerdefinierten Exceptions ausl sen QUESTION 77 LPAREN 5000 RPAREN 5 x LBRACK 5070 g RBRACK Q Fi FOR for Listing 37 Definition von Tokens F r Parser und Treeparser gilt dies nicht 143 E Detaillierte Funktionsweise von ANTLR E 1 5 Regeln in der Parsergrammatik In der Parsergrammatik wird in den Regeln die Syntax der zu akzeptierenden Ausdr cke an gegeben Dabei sollten dieselben Tokens wie in der Lexergrammatik benutzt werden In der Parsergrammatik sind die Vorkommen der Tokens als Tokenreferenz zu betrachten d h eine Tokenreferenz veranlasst den Lexer die Zeichenfolge welche das Token symbolisiert zu erkennen Die Tokenreferenzen d rfen nur auf der rechten Seite der Regeln verwendet werden und m ssen mit einem Gro buchstaben beginnen Auf der linken Seite stehen die Symbol bezeichner in ANTLR auch Regelnamen genannt Kommt ein Symbolbezeichner auf der rechten Seite vor dann gilt dieser als Regelreferenz aber nur innerhalb der Parsergramma tik Symbolbezeichner und referenzen beginnen mit einem Kleinbuchstaben Der Symbol bezeichner der ersten Regel ist auch automatisch das Startsymbol Wird in der Parsergrammatik ein String benutzt f r welchen 1m Lexer kein Token mit ent sprechendem Bezeichner erzeugt wird s
92. ds e 61 E E 8 161 E 4032nu31su05JOJ93eurejeqedA s e SIEH JO 1939ueIegad JS e JO40jauieieqodA s e Sse 5jOJo3eureJeqed A s e Abbildung 31 Kantentypenhierarchie Teil 12 13 71 A Metamodell der Graphklassen Jo oiguonejouuys s Jo poigunugs JO porgi1ue1suo2uunuas e 302201851 Jo poige ejieu isi 5 JOMO gssejos 1 f Abbildung 32 Kantentypenhierarchie Teil 13 13 T2 B Schema der Graphklassen i Schema javaextractor schema Java5Schema 2 3 EnumDomain InfixOperators ASSIGNMENT EQUALS PLUS MINUS MULTIPLICATION DIVISION AND SHORTCIRCUITAND OR SHORTCIRCUITOR MODULO LEFTSHIFT RIGHTSHIFT UNSIGNEDRIGHTSHIFT UNEQUALS XOR PLUSASSIGNMENT MINUSASSIGNMENT MULTIPLICATIONASSIGNMENT DIVISIONASSIGNMENT GREATER GREATEREQUALS LESS LESSEQUALS MODULOASSIGNMENT LEFTSHIFTASSIGNMENT RIGHTSHIFTASSIGNMENT UNSIGNEDRIGHTSHIFTASSIGNMENT ANDASSIGNMENT ORASSIGNMENT XORASSIGNMENT INSTANCEOF EnumDomain PrefixOperators PLUS MINUS NOT BITWISECOMPLEMENT INCREMENT DECREMENT 73 B 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 6 oo 69 70 71 12 73 y IN 75 7 ON T 7 oo 7 oo oo
93. e Parser soll AST erzeugen importVocab MyVocabulary Zu benutzendes Vokabular an Tokens Listing 23 Optionsabschnitt einer Parsergrammatik Tokendefinitionen Die Tokendefinitionen dienen f r ggf n tige Anpassungen der To kens an die Grammatik I d R werden die Tokens im Lexer erzeugt und deshalb auch in dessen Grammatik definiert Diese Tokens stehen dann zur Verwendung in weiteren Gram matiken zur Verf gung wenn die Option exportVocab gesetzt wurde wie in Listing 22 gezeigt Mit der Option importVocab siehe Listing 23 wird das Vokabular in einer ande ren Grammatik nutzbar gemacht F r den Fall dass beispielsweise im Vokabular ben tigte Tokens fehlen oder diese anderen Werten zugeordnet werden sollen k nnen die Tokens in den Tokendefinitionen angepasst wer den 137 E Detaillierte Funktionsweise von ANTLR Dies kann nicht nur bei der Verebung von Grammatiken vorkommen sondern auch bei einfa cher Verwendung des Vokabulars Da im Treeparser nur AST Elemente angesprochen werden k nnen die auf einem Token basieren werden oft imagin re Tokens definiert um beispiels weise abstraktere Strukturen ansprechen zu k nnen tokens EXPR ein kompletter Ausdruck DECL eine Deklaration Listing 24 Tokendefinitionen Eigene Methoden Die eigenen Methoden m ssen in der Zielsprache geschrieben sein da diese unver ndert in den Quelltext der erzeugten Klasse nach dem Inhalt aus dem Hea der kopiert
94. e Boolean 255 256 257 23 oo 259 VertexClass FloatConstant Expression value Double literal String VertexClass DoubleConstant Expression value Double literal String xo VertexClass IntegerConstant Expression value Long literal String 261 262 263 VertexClass LongConstant Expression value Long literal String x4 VertexClass CharConstant Expression value Integer literal String 265 26 ON 267 26 oo N ON N SI oo VertexClass StringConstant Expression value String VertexClass Arraylnitializer Expression EdgeClass IsSizeOf AttributedEdge from Expression 1 to Arraylnitializer 1 1 EdgeClass IsContentOf AttributedEdge from Expression to Arraylnitializer 1 1 VertexClass ArrayCreation Expression EdgeClass IsElementTypeOfCreatedArray IsTypeOf from TypeSpecification 1 to ArrayCreation 1 1 EdgeClass IsDimensionlnitializerOf AttributedEdge from Arraylnitializer 1 x to ArrayCreation 1 1 VertexClass ObjectCreation Expression EdgeClass IsTypeOfObject AttributedEdge from TypeSpecification 1 1 to ObjectCreation 1 1 EdgeClass IsConstructorInvocationOf AttributedEdge from Methodlnvocation 1 1 to ObjectCreation 1 1 80 279 20 VertexClass Variablelnitializer Expression 21 EdgeClass IslnitializerOf AttributedEdge from Expression 1
95. e Black getPackageNameFromSupreme Type String etFetur TypeFrombdlethodinvocation tethodinvacation Extractiontlode mMethodResolve Type etSuperClasaClassPetinition Classbefinition etSupremeTvpeFramSceopae Vertex SymbolTable Type etTvpeFramFieldDPeclaratianiFieldDeclaration FieldAccess Type etTypeF roamObjectCreation ObjectCreation Type ook Hr oko oco c co Gb GbOGE OG 6o 6o 6o x Abbildung 5 Klassendiagramm des Package javaextractor resolvers 3l 7 Funktionsweise des Javaextraktors 7 Funktionsweise des Javaextraktors Der Ablauf des Extraktionsprozess ist in mehrere voneinander abgegrenzte Arbeitsschritte aufgeteilt Einen berblick verschafft das Aktivit tsdiagramm in Abbildung 6 Die Arbeits schritte werden in folgender Reihenfolge ausgef hrt l 32 Die bergebenen Kommandozeilenparameter eine genaue Beschreibung folgt in Ab schnitt 8 2 werden interpretiert und die entsprechenden Einstellungen gesetzt Aus allen Dateien und Verzeichnissen welche beim Aufruf bergeben wurden wird eine Liste der enthaltenen java Dateien erstellt Im Falle von Verzeichnissen werden auch alle enthaltenen Unterverzeichnisse rekursiv mit einbezogen Angegebene aber nicht existente Elemente werden dabei ignoriert ebenso alle Dateien welche nicht auf die Erweiterung java enden Es wird ein leerer dem verwendeten Schema entsprechender TGraph erzeugt Dar ber hinaus werden einige grundlegende Knoten un
96. eclarationOfAccessedField vonVariableDeclaration ParameterDeclaration bzw EnumConstant zuFieldAccess Knoten Da es sich dabei um semantische Kanten handelt sind diese nicht mit Positionsinformationen attributiert Beim Aufl sen einer Typspezifikation muss ggf der Name des spezifizierten Typs der in einem Knoten mitgespeichert wird angepasst werden Dies ist der Fall wenn eine Typspezi fikation nicht vollqualifiziert im Quelltext vorliegt Wird beispielsweise eine Variable v per Vector v deklariert so ist die Typspezifikation Vector nicht vollqualifiziert Im Gra phen existiert somit ein Knoten vom Typ QualifiedType der in seinem Attribut fullyQualifiedName den String Vector speichert Die Aufl sung ergibt dass die Klas se java util Vector gemeint ist Der vollqualifizierte Name java util Vector wird dann in den Knoten eingetragen Im Graphen sollen Knoten die eine Variable einen Typ oder eine Methode repr sentieren nur einmal vorkommen In einem Quelltext werden solche Elemente definiert auf die dann ber deren Namen zugegriffen wird Im Quelltext kann somit der Name mehrfach vorkommen Im Graphen hingegen soll dessen Repr sentation einzigartig sein F r jedes Vorkommen im Quelltext soll im Graphen aber eine Kante erzeugt werden Um dies sicherzustellen wird beim Aufl sen einer Referenz berpr ft ob diese bereits zuvor aufgel st wurde und somit eine kor rekte Graphenrepr sentation schon existiert Ist dies der Fall wird
97. efinition ist dabei ber zwei Kanten erreichbar ber IsMemberOf zum Block der Typdefinition und von dort ber IsBlockOf zur Typdefinition selbst LAZY Dies ist der Standardmodus In diesem Modus werden Referenzen nur im Rahmen der zu parsenden Quelltexte aufgel st Eine Quelltextreferenz kann nur aufgel st werden wenn die Klasse die das referenzierte Element definiert ebenfalls vom Javaextraktor 1m sel ben Arbeitsgang geparst wird d h dass z B Typen aus der Java API nur aufgel st werden k nnten wenn sie auch vom Javaextraktor geparst werden w rden Dieser Modus sollte benutzt werden wenn Referenzen zu externen Klassen bei der Analyse des Softwareprojekts nicht von Interesse sind Zu beachten ist allerdings auch dass in diesem Modus auch keinerlei interne Methoden aufgel st werden k nnen welche einen Parameter eines externen Typs besitzen was schon auf einen einfachen St ring zutrifft EAGER In diesem Modus werden Referenzen im Rahmen der zu parsenden Quelltexte und dem CLASSPATH aufgel st Referenzen die nicht im LAZY Modus aufgel st werden k n nen werden im EAGER Modus per Reflection im CLASSPATH gesucht Definitionen die ber den CLASSPATH erreichbar sind sind nicht im Graphen repr sentiert da ihre Klassen nicht geparst wurden Dies muss somit noch nachgeholt werden Ist ein Aufl sen erfolgreich Es kann auch auf das gesamte Array oder eine der Dimensionen eines mehrdimensionalen Arrays zugegriffen werden
98. eilen Beschreibung auf der Homepage zu JAbstract zwingt sich einem der Gedanke auf dass es sich hier nur um ein Proof of Concept Projekt handelt Auf eine E Mail von uns ob JAbstract noch gepflegt werde bekamen wir die Antwort dass wir uns lieber das System Stratego anschauen sollten da dieses wesentlich besser f r unsere Zwecke geeignet sei Stratego erzeugt aber keine Parser in Java und wurde deshalb nicht weiter untersucht Position amp L nge der Token im Quelltext Da es sich um eine JavaCC Grammatik handelt kann die Position der Tokens und deren L nge abgerufen werden Wird eine Referenz im AST auf das Ursprungstoken gehalten k nnen Position und L nge auch nach dem Parsing abgerufen werden Parsingtest Diese entfallen da nur die Java Sprachversion 1 1 unterst tzt wird 103 C Dokumentation der Onlinerecherche frei verf gbar Tabelle 18 bersicht JAbstract C 3 2 JRefactory Eine kurze bersicht zu den wichtigsten Daten von JRefactory findet sich in Tabelle 19 Historie Die Entwicklung von JRefactory wurde 1999 von Chris Seguin begonnen und 2002 von Mike Atkinson bernommen Die letzte ver ffentlichte Version stammt von Ende 2003 und auch die Homepage ist seit diesem Zeitpunkt nicht mehr wesentlich aktualisiert worden Mittlerweile kann das Projekt als eingestellt angesehen werden da seit 2004 weder Aktivit ten in der Entwicklung noch in der begleitenden Mailingliste dem Forum oder der Homepage verze
99. en Dadurch waren die Pr zedenzen der Syntax von Java im Metamodell noch ver treten Besonders durch die Ber cksichtigung der Operatorpr zedenzen f hrte dies zu kom plizierten ver stelten und un bersichtlichen Strukturen mit uneleganten Bezeichnern wie AnnotationDefinitionPart2 Die nummerierten Klassen enstanden als Behelfskon strukte bei der Anwendung der Heuristiken zur Veroderung und Verkettung Die Klassen hat ten keinen direkten Vertreter in der Gramatik Im Nachinein betrachtet sind diese Heuristiken nicht zur Abbildung von Pr zenden geeignet Zun chst waren die Assoziationen nur als Aggregationen mit Rollen im Modell vertreten Diese sollten im Zuge der Uberarbeitungen durch einfache Assoziationen mit Namen ersetzt werden Da alle Bezeichner unver ndert aus der Grammatik bernommen worden waren waren bli che Java Termini nur wenig vertreten Ein Gro teil der Klassen trug den eigenen Namen als Rollenbezeichner Insgesamt bestand das Modell aus 175 Klassen 247 Ageregationen und 87 Generalisierungen Eine berarbeitung des Metamodells war somit dringend erforderlich V2 Der Fokus der ersten berarbeitung lag auf den im vorherigen Abschnitt angef hrten Schw chen des Modells Diese wurden exemplarisch an den Knotentypen Statement und Expression behoben Dazu wurde zun chst von der Syntax und den inh renten Pr zedenzen abstrahiert um flache Generalisierungshierarchien zu erhalten Alle Anweisungen waren direkt vo
100. en dann ist der Dokumentationsgrad als sehr hoch bewertet Existiert keine brauchbare Dokumentation f hrt dies zum Ausschluss des Werkzeuges Aktivit t Befand sich das Werkzeug in einer st ndigen Weiterentwicklung und Verbes serung und existierte eine lebendige Community um dieses Projekt war dies als positiv zu bewerten gerade im Hinblick auf eine durchaus zu erwartende sp tere Weiterentwicklung des Javaextraktors War dies nicht der Fall f hrte dies nicht unmittelbar zum Ausschluss des Werkzeuges Position und L nge eines Elements im Quelltext abrufbar Zur weiteren Verwen dung der erzeugten Graphen in Gupro m ssen Position und L nge von Elementen im Quelltext im Graphen gespeichert werden Dazu sollte das Werkzeug die Abfrage dieser Werte erm g lichen Ist dies nicht der Fall f hrt dies nicht unmittelbar zum Ausschluss des Werkzeuges da diese Funktionalit t eventuell nachger stet werden kann 3 2 Ergebnis der Onlinerecherche Untersucht wurden Parsergeneratoren Werkzeuge die Parsergeneratoren benutzen quelloffe ne Java Compiler Implementationen und die Java Development Tools aus Eclipse Tabelle 1 listet alle untersuchten Werkzeuge und die ermittelten Ergebnisse auf Bei Werkzeu gen die nicht zum Laufen gebracht werden konnten oder die laut Dokumentation keine Un terst tzung von Java 5 bieten wurden keine Parsingtests durchgef hrt Dies 1st entsprechend in der Tabelle vermerkt Erf llte ein Werkzeug
101. eparser geschehen 142 EI Grundlagen type classOrInterfaceType x builtInType System out println x getText Listing 35 Ausgabe des Text eines Symbols ber ein Label Soll in einer Aktion auf den R ckgabewert einer Regelreferenz zugegriffen werden sofern diese einen liefert muss das Symbol einem Identifier nur per Gleich 2 zugewiesen wer den Im Lexer kann nur auf das zu erzeugende Token zugegriffen werden da jede Regel nur eine Tokendefinition zul sst Dazu wird kein Label ben tigt sondern es reicht ein Dollarzeichen zu Anfang der semantischen Aktion f r den Zugriff In Listing 36 wird dadurch der Typ des Tokens WS Whitespace auf SKIP gesetzt damit der Parser dieses sp ter fallen l sst und zum n chsten bergeht WS 7 7 Ar An I An Ct SsetType Token SKIP Listing 36 Setzen des Typs eines Tokens auf SKIP Im folgenden Abschnitt wird auf Besonderheiten der Regeln der Lexergrammat k n her ein gegangen E 1 4 Regeln in der Lexergrammatik Die Regeln des Lexers definieren lediglich die Tokens Diese stehen auf der linken Seite und die zu erkennenden Terminale auf der rechten Seite der Regeln Strings m ssen zwischen Anf hrungszeichen stehen und werden vom Lexer als Zeichensequenz interpretiert Bsp aus Tor wird f o r Auch in der Lexergrammatik k nnen semantische Aktionen definiert werden Zwar ist dort Jede Auspr gung von Javaquelltexten erlaubt je
102. er Instanziierung des JavaLexerAdapter im Konstruktor ber geben werden Der Lexer muss wiederum bei der Instanziierung des Parsers im Konstruktor bergeben und angewiesen werden die neuen Tokens zu erzeugen Dies kann auf folgende Weise geschehen i LexerSharedInputStateAdapter inputState new LexerSharedinputStateAdapter fileName JavaLexerAdapter javaLexer new JavaLexerAdapter inputState 3 javaLexer setTokenObjectClass javaextractor adapters CommonTokenAdapter 4 JavaRecognizer javaParser new JavaRecognizer javaLexer Abbildung 1 veranschaulicht die Anpassung in einem Klassendiagramm 4 3 2 Anpassung Position des Tokens im AST verf gbar Hinzu kommt dass diese Informationen nicht mehr im erzeugten AST abrufbar sind Um die Position eines Tokens selbst im AST verf gbar zu machen waren zus tzlich Ma nahmen n tig Abstrakte Syntaxb ume werden in ANTLR durch die Klasse ANTLR CommonAST implementiert Diese werden durch einen Parser erzeugt Die Attribute des AST werden durch initialize Methoden gef llt Wenn der Parser ein AST Element erzeugt ruft er zus tzlich eine dieser Methoden auf Um die Position eines Tokens selbst im AST verf gbar zu machen wurde wieder eine Adap terklasse implementiert Die neue Klasse CommonASTAdapter kennt zus tzlich ihr Token und berschreibt alle initialize Methoden damit sie die Referenz auf das Token setzen kann Um die neue Funktionalit t zu nutzen mus
103. eren Grammati ken Stahl Wisniewski sind aufgrund der bereits im Test der verschiedenen Tools gefundenen Fehler ausgeschieden Um die Analyse dieser erweiterten Tests zu erleichtern war es zun chst n tig das verwen dete Testprogramm zu modifizieren Da die Konsole sowohl unter Windows als auch unter Linux aufgrund der begrenzten maximalen Zahl der Ausgaben und der beschr nkten Breite nicht gerade ideal bei der Analyse gr erer Codemengen ist wurden jegliche Ausgaben in eine Textdatei geschrieben anstatt auf die Konsole Desweiteren wurde die Verarbeitungszeit gemessen und ebenfalls in der Ausgabedatei gespeichert Der zugeh rige Code findet sich in Listing 16 D 2 Breitentests Da es unm glich ist alle in Java m glichen Kombinationen von Sprachkonstrukten mit einem vertretbaren Aufwand in einzelnen Testf llen durchzuspielen und wir auch nichts in der Art einer Testsuite f r Java Parser oder Compiler finden konnten haben wir einige gr ere quelloffen verf gbare Projekte parsen lassen D 2 1 JDK Die Quelltexte des Java Developer Kits Version 1 5 0 06 waren die Wahl f r den ersten Test Die insgesamt 6 555 Dateien ergeben ein Datenvolumen von knapp 63 MB Das Parsing verlief vollst ndig fehlerfrei alle Dateien wurden ohne Probleme akzeptiert D 2 2 Eclipse Zum zweiten Test haben wir die Quelltexte des Eclipse SDK Version 3 1 2 verwendet wel che knapp 90 MB grob sind und sich auf 12 304 Dateien verteilen
104. es auf der Homepage Links zu weiteren externen Grammatiken Zu JavaCC geh rt auch das Programm JJDoc welches zu einer Grammatik eine HTML Dokumentation erzeugen kann Diese besteht aus einer BNF der Nichttermminale die un tereinander verlinkt sind Verwendung Bei JavaCC handelt es sich um ein Kommandozeilenwerkzeug Als Auf rufparameter wird diesem unter anderem der Pfad zur Grammatik mitgeteilt die in einen Parser bersetzt werden soll Anschliebend kann dieser kompiliert und mit der zu parsenden Datei als Paramater aufgerufen werden Zur Laufzeit ben tigen die erzeugten Parser keine Komponenten von JavaCC Eigene Erfahrungen Da JavaCC in einem vorkompilierten JAR Paket geliefert wird ent f llt die Einrichtung des Tools und man kann direkt damit arbeiten ein JDK vorausgesetzt Das Erzeugen der Parser aus den mitgebrachten Beispielgrammatiken darunter auch eine f r Java Version 5 funktionierte auf Anhieb wie dokumentiert Allerdings musste zur Verwen dung der Parser noch die CLASSPATH Umgebungsvariable gesetzt werden was die Doku mentation leider verschwieg Danach war das Einbinden in eigene Projekte auch Eclipse m helos m glich Position amp L nge der Tokens im Quelltext Aus der Schnittstellen Beschreibung geht hervor dass von jedem Token Anfang und Ende m Eingabestrom abgerufen werden kann Beh lt man zu jedem Knoten im AST eine Referenz auf das Ursprungstoken kann auch nach dem Parsing auf dieses zugegrif
105. estand nun aus 132 Klassen 172 Aggregationen und 73 Generalisierungen 2l 33 Expression 2 2 PostfixExpression PostFixOperator Integer 1 1 Ihs 29 Expression Abbildung 46 Modell der Post FixExpression nach berarbeitung V3 Im n chsten Schritt haben wurden die oben angef hrten Verfahren auf die Knotenty pen ClassDefinition und ConstructorDeclaration Danach waren die einzel nen Elemente der Klassendefinition und Konstruktordeklaration auf einer Ebene angeordnet Die syntaktische Reihenfolge kann im Metamodell nicht explizit festgelegt werden deshalb wurden die Reihenfolge im Klassendiagramm graphisch abgebildet So kann ein Entwickler die vom Programmieren her bekannten Strukturen einfacher wiedererkennen Der Knotentyp Type sp ter zu TypeSpecification umbenannt der eine Typspezifika tion repr sentiert musste regelrecht zusammengesucht werden da seine Teile ber das ganze Modell verstreut lagen Hier w hlten wir eine Strukturierung in Anlehnung an das Metamodell von Hinterw ller Ferner wurden alle Klassen und Attributnamen im Modells in Anlehnung an Javatermini ver einheitlicht sowie die Knotentypen EmptyStatement und NullExpression eingef hrt Diese waren in der Grammatik nicht explizit vorhanden da der Parser die Tokens welche eine leere Anweisung oder den nul 1 Ausdruck repr sentieren fallen l sst Entfernt wurden Klassen die Sammlungen repr sentieren Bsp ParameterList ArgList Diese r
106. esultieren aus Regeln der Parsergrammatik die dort f r mehr berschaubarkeit sorgen Im Metamodell ist das Gegenteil der Fall Daher wurden diese durch entsprechende Kardina l t ten an den in den Sammlungen zusammengefassten Klassen ersetzt 26F r die richtige Reihenfolge der Elemente im Graphen muss der Faktenextraktor sorgen Er muss sicherstellen dass die syntaktische Reihenfolge bei der Erstellung des Graphen miteinfliesst da die einzelnen Elemente durchnummeriert werden 159 F Entwicklung eines neuen Metamodells TraditionalForClause 1 ES isl teratorOf ArgList isArgumentOf Expression Abbildung 47 Modell der TraditionalForClause aus dem Entwurf Nach diesem Schritt war das Metamodell zur H lfte berarbeitet worden Es war abermals berschaubarer und dadurch verst ndlicher geworden Das Klassendiagramm bestand m ttler weile aus 115 Klassen 163 Aggregationen und 73 Generalisierungen Nun war klar dass eine generelle Verbesserung des Modells durch eine konsequente Verein fach erreicht werden konnte F 1 3 Weitere Heuristiken Im Zuge der berarbeitung konnten weitere Heuristiken zur Erstellung eines Metamodells hergeleitet werden Diese erg nzen jene aus Abschnitt F 1 1 und erh hen angewendet erheb lich die Qualit t eines Metamodells e strukturell vereinfachend Verwerfung der Pr zedenzen durch Aufbrechen der Strukturen und Gruppierung aller Subklassen einer Klasse in fla
107. etwa Behandlung von erst zur Laufzeit erkennbaren Sonderf llen sinnvoll E 2 5 Treeparser Grammatik Neben der Erzeugung von Lexern und Parsern bietet ANTLR auch die Erzeugung von Tree parsern auch als Treewalker bezeichnet an Grunds tzlich gilt hier das gleiche wie f r die Parsergrammatik allerdings traversiert der Treeparser einen AST anstelle eines Tokenstreams den der Lexer zur ckgibt Die Auswertung eines arithmetischen Ausdrucks kann auch ber eine Treeparser Grammatik erfolgen Bevor der Treeparser zum Einsatz kommen kann muss jedoch im Optionsteil der Parsergram matik die Option buildAST true gesetzt werden um den Parser anzuweisen auch einen AST aufzubauen Ferner m ssen die Tokens in allen Regeln der Grammatik erg nzt werden damit der Parser auch weiss welche Elemente in den AST aufgenommen werden sollen Die neue Parsergrammatik f r den Beispieltaschenrechner sieht dann wie in Listing 45 aus 152 E 2 Ein Beispieltaschenrechner Abbildung 43 AST vereinfacht f r den Ausdruck 3 4x5 class ExprParser extends Parser options buildAST true j expr mexpr PLUS MINUS mexpr mexpr atom STAR atom x atom NT LPAREN expr RPAREN Listing 45 Angepasste Parsergrammatik zur Erzeugung eines AST Ein Accent Circonflexe 7 hinter einer Tokenreferenz weist den Parser an einen entsprechen den AST Knoten und alle weiteren Elemente der Regel als dessen Kinderknoten in den Baum aufzuneh
108. ewka Katrin 2006 Entwurf und Definition der Graphanfragesprache GReQL 2 Zugl Koblenz Univ Dipl 2006 13 Parr Terrence ANTLR Website http www antlr org Abruf 01 2008 14 Parr Terrence An Introduction To ANTLR http www cs usfca edu parrt course 652 lectures antlr DT md Abruf 09 2006 15 Parr Terrence 2005 ANTLR Reference Manual http www antlr org doc index html Abruf 09 2006 16 Parr Terrence ANTLR Reference Manual Grammar Options http www antlr org doc options html Abruf 09 2006 17 Parr Terrence ANTLR Reference Manual Meta Language http www antlr org doc metalang html _bb2 Abruf 09 2006 183 Literatur 18 Studman Michael Java 5 Grammar for ANTLR http www antlr org grammar 1090713067533 index html Abruf 01 2008 19 Gupro Re Group Projekt SVN Repository https svn uni koblenz de gup re group trunk proJject Abruf 09 2006 21 Homepage von JLex http www cs princeton edu appel modern java JLex Abruf 01 2008 22 Grammatiken f r JavaCC http javacc dev java net Abruf 01 2008 23 Grammatiken f r JavaCC http www cobase cs ucla edu pub javacc Abruf 06 2006 24 CUP bis 1999 http vvv cs princeton edu appel modern 2ava CUP Abruf 01 2008 1251 CUP ab 1999 http www2 cs tum edu projects cup Abruf 01 2008 26 Homepage von CoCo R http www ssw uni linz ac at Research Projects Coco Abruf 01 2008 27 Homepage v
109. f einer Preview basiert genauer Prototyp 2 2 von JSR 14 JSR 201 vom Juli 2003 Das Parsen der Quelltexte mit problematischen Newlines bereitet dem Parser hingegen keine Schwierigkeiten Eine bersicht zu den Testergebnissen findet sich in Tabelle 9 C 2 3 Coco R Eine kurze bersicht zu den wichtigsten Daten von Coco R findet sich in Tabelle 12 97 C 2 Parsergeneratoren Tesiquelltext EscapeSequences TestZeilenumbrueche ASCII Tabelle 9 Ergebnisse Parsingtests CUP Rechercheergebnis jn oS Parser in Java Tabelle 10 bersicht CUP 93 C Dokumentation der Onlinerecherche Historie Der Coco R Compilergenerator der Universit t Linz ging aus einer Diplomarbeit aus dem Jahr 1983 hervor Das damals von Hans M ssenb ck geschriebene Werkzeug Coco wurde 1987 von ihm zu Coco R noch in Oberon weiterentwickelt Bis heute wurden meist durch Dritte Varianten dieses Werkzeug in eine Vielzahl von verschiedenen Programmier sprachen portiert Die Quelltexte sind frei verf gbar und unterliegen der GNU GPL Coco R wird weiter gepflegt und erfuhr zuletzt im September 2005 ein Update Charakterisierung Dieser LL k Parsergenerator existiert in und f r eine Vielzahl von Programmiersprachen Einige Grammatiken sind auf der Homepage siehe 26 erh ltlich auch f r Java aber nur bis Sprachversion 1 4 Auch Coco R bietet keine automatische Er zeugung von B umen Diese Funktionalit t muss als Aktionscode zu den
110. faceBlock 185 gt 186 i enumDefinition 188 7 enum IDENT 189 implementsClause 190 enumBlock 191 192 170 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 E2 Javagrammatik aus ANTLR annotationDefinition Q interface IDENT annotationBlock typeParameters cU typeParameter typeParameter typeArgumentsOrParametersEnd typeParameter IDENT typeParameterBounds typeParameterBounds extends classOrInterfaceType amp classOrInterfaceType classBlock classField de interfaceBlock interfaceField x annotationBlock annotationField enumBlock 171 F Entwicklung eines neuen Metamodells 236 enumConstant enumConstant 237 3 classField 238 239 5 240 21 annotationField 242 we modifiers 243 typeDefinitionInternal 244 typeSpec 245 IDENT 246 A Sen 247 declaratorBrackets 248 default annotationMemberValuelnitializer 249 ps 250 variableDefinitions 251 252 253 254 255 enumConstant 256 He annotations 257 IDENT 258 argList 259 enumConstantBlock 260 A 261 22 enumConstantBlock 263 1
111. fen werden 88 C 2 Parsergeneratoren Parsingtests Die neuen Java 5 Ausdr cke bereiten dem Parser keine Schwierigkeiten obschon seine Grammatik vom Februar 2004 stammt also schon vor dem Erscheinen der endg ltigen Fassung von Java 5 Allerdings stolpert der Parser in den fehlerfreien Quelltexten jedesmal ber den Ausdruck aus Listing 2 int iaa new int 10 10 for int ia iaa hier erwartet der Parser etwas anderes Listing 2 Quelltextauszug der f r JavaCC problematisch ist Offensichtlich kommt dieser mit Arrays in for Konstrukten nicht klar und erwartet eine Lauf variable zum Indexieren Aus diesem Grund schl gt auch das Parsen von AllowedForEach Construct java TestJSR201 java und TestJSR201 Berichtigt java fehl da auch diese Klassen o a Code enthalten Wird dieser Code auskommentiert gelingt der Parsingvorgang erfolg reich Doch auch in der Klasse Test15 stolpert der Parser ber den eigentlich korrekten Ausdruck aus Listing 3 new String K Integer xh 2 hier meldet der Parser einen Fehler Listing 3 Quelltextauszug der f r JavaCC problematisch ist In diesem Fall kommt der Parser nicht mit Generic Ausdr cken nach einem new klar Wird der Code auskommentiert meldet der Parser in der n chsten Zeile den selben Fehler bei einem hnlichen Ausdruck Nach weiterem Auskommentieren wird die Klasse endlich erfolgreich geparst Auch beim Parsen der fehlerhaften Quelltexte hinterl ss
112. fierOfParameter IsModifierOf from Modifier 1 to ParameterDeclaration 1 1 EdgeClass IsTypeOfParameter IsTypeOf from TypeSpecification 1 1 to ParameterDeclaration 1 1 EdgeClass IsParameterNameO t AttributedEdge from Identifier 1 1 to ParameterDeclaration 1 1 VertexClass VariableLengthDeclaration ParameterDeclaration sal VertexClass Label Statement 32 Nn 32 ON 327 32 oo 32 330 33 332 333 334 33 33 ON 337 33 oo 33 EdgeClass IsLabelNameOf AttributedEdge from Identifier 1 1 to Label 1 1 EdgeClass IsAttachedTo IsStatementOf from Statement 1 1 to Label 1 1 VertexClass If Statement EdgeClass IsConditionOflf IsConditionOf from Expression 1 1 to f 1 1 EdgeClass IsThenOf IsStatementOf from Statement 1 1 to f 1 1 EdgeClass IsElseOf IsStatementOf from Statement 0 1 to f 1 1 VertexClass For Statement EdgeClass IsHeadOfFor AttributedEdge from ForHead 1 1 to For 1 1 EdgeClass IsLoopBodyOfFor IsLoopBodyOf from Statement 1 1 to For 1 1 VertexClass TraditionalForClause ForHead EdgeClass IsRunVariablelnitializationOf AttributedEdge from Statement to TraditionalForClause 1 1 EdgeClass IsForConditionOf IsConditionOf from Expression 1 to TraditionalForClause 1 1 EdgeClass IslteratorOf AttributedEdge from Express
113. ge from Case to Switch 1 1 ss EdgeClass IsDefaultCaseOf AttributedEdge from Default 1 to Switch 1 1 e EdgeClass IsCaseConditionOf IsConditionOf from Expression 1 1 to Case 1 1 vo EdgeClass IsStatementOfCase IsStatementOf from Statement 0 x to Case 1 1 n EdgeClass IsStatementOfDefaultCase IsStatementOf from Statement x to Default 1 1 o LA o2 LA LA 372 313 VertexClass Try Statement VertexClass Catch Statement 315 EdgeClass IsBodyOfTry AttributedEdge from Block 1 1 to Try 1 1 376 EdgeClass IsHandlerOf AttributedEdge from Catch x to Try 1 1 83 3T 37 oo 37 380 381 38 N 383 384 38 Nn 38 ON oo LA N LA LA 204 39 Nn 39 nN Schema der Graphklassen EdgeClass IsCaughtExceptionOf AttributedEdge from ParameterDeclaration 1 1 to Catch 1 1 EdgeClass IsBodyOfCatch AttributedEdge from Block 1 1 to Catch 1 1 EdgeClass IsBodyOfFinally AttributedEdge from Block 0 1 to ry 1 1 VertexClass Throw Statement EdgeClass ls 1 hrovvnExceptionOfT AttributedEdge from Expression 1 1 to Throw 1 1 3 VertexClass Synchronized Statement EdgeClass IsMonitorOf AttributedEdge from Expression 1 1 to Synchronized 1 1 EdgeClass IsSynchronizedBodyOf AttributedEdge from Block 1 1 t
114. geln n der Treeparsergrammatik E 1 7 Umsetzung der Grammatik in Javaquelltext E 2 Ein Beispieltaschenrechner E 2 1 Lexergrammatik E 2 2 Parsererammatik cocos 2 a 4 e 8 E 2 3 Erzeugung amp Benutzung E 2 4 Auswertung im Parser E 2 5 Treeparser Grammatik F Entwicklung eines neuen Metamodells Ed Vorgehensweise 24 serias bee da ba gos F 1 1 Heuristiken f r den Entwurf F 1 2 Entwurf und berarbeitung des Metamodells F 1 3 Weitere Heuristiken F 1 4 Weitere berarbeitung F 1 5 Verifikation des Metamodells F 1 6 Designentscheidungen E2 Javagrammatik aus ANTLR Inhaltsverzeichnis 1 Einf hrung und Motivation Software muss nach ihrer Auslieferung gewartet werden Das hei t sie muss korrigiert mo difiziert weiterentwickelt oder perfektioniert werden Dieser Prozess kann Jahre oder auch Jahrzehnte ber den urspr nglichen Auslieferungstermin hinaus andauern Es existieren viele Altsysteme welche heute noch im Produktiveinsatz sind und weiterhin gewartet werden m ssen Oft jedoch sind die urspr nglichen Entwickler nicht mehr f r die Software zust ndig Hinzu kommt nicht selten ein unzureichender Dokumentationsgrad der Software Diejenige Person die nun in die Wartung des Systems involviert wird befindet sich somit meist in einer
115. h Knoten und Kantentypen zur Repr sentation von Kommentaren im Quelltext in das Metamo dell aufsenommen Somit war das komplette Metamodell einmal berarbeitet worden Fast 162 EI Vorgehensweise alle Elemente waren in Generalisierungstrukturen angeordnet Es konnten dieser sieben unter schieden werden mit folgenden Klassen als Basistypen e Type e TypeSpecification e Member e Statement e Expression e Annotation e Comment Im Zuge der weiteren berarbeitung sollten diese Klassen sp ter in eigenen Packages geordnet werden Insgesamt nderte sich gegen ber der Vorversion an der Gr e des Metamodells fast nichts Nur die Anzahl der Knotentypen verringerte sich Dies lag am doppelten Vorkommen vieler Assoziationsnamen ein Umstand der in der n chsten berarbeitung korrigiert werden musste Trotzdem war das Metamodell bersichtlicher und somit verst ndlicher geworden Es bestand somit aus 88 Klassen 93 einfachen Assoziationen mit Namen und 63 Generalisierun gen V6 Aufgrund von technischen Restriktionen k nnen Kanten immer nur zwischen zwei fest definierten Knoten existieren Durch Ableitung der Knoten kann die selbe Kante auch zwi schen den abgeleiteten Knoten existieren Das Metamodell betand aus 89 Klassen 57 Gene ralisierungen und 143 einfachen Assoziationen mit Namen V7 Im letzten Schritt wurden semantische Kantentypen eingef hrt die keine Attribute ha ben Die Kantentypen haben keine Attribute da
116. h ngig Ist ein Werkzeug nicht in Java geschrieben f hrt dies jedoch nicht automatisch zum Aus schluss da keine Festlegung auf eine einzige Programmiersprache besteht Grammatik f r Java bis Version 5 Damit der Javaextraktor auch aktuelle Softwarepro Jekte verarbeiten kann sollte das Parsen von Quelltexten bis Javasprachversion einschlie lich Version 5 m glich sein Neben der Recherche in der Projektdokumentation wurde dies auch mittels Parsingtests mit Quelltexten die spezifische Sprachkonstrukte aus Java 5 enthielten berpr ft Besteht ein Werkzeug diesen Test nicht so f hrte dies noch nicht zum Ausschluss da dieser Mangel eventuell behoben werden kann Verf gbarkeit der Quelltexte Gerade f r die Verwendung im Javaextraktor ist eine Ver f gbarkeit der Quelltexte zwingend erforderlich Auch die Lizenzierung von Quelltexten ge gen vertretbare Kosten ist m glich Ist dies nicht der Fall f hrt dies zum Ausschluss des Werkzeuges 3 2 Ergebnis der Onlinerecherche Dokumentationsgrad Umfasst die Dokumentation zumindest ein Benutzerhandbuch welches die Verwendung und ggf Erzeugung des Werkzeuges erkl rt wird der Dokumentati onsgrad als niedrig bewertet Gibt es zus tzlich eine API Spezifikation so ist der Dokumen tationsgrad mittel Existieren dar berhinaus FAQ s Tutorial s Wiki s oder vergleichbares gilt der Dokumentationsgrad als hoch Ist desweiteren auch noch Support durch Mailinglisten oder Foren gegeb
117. h heute noch als Professor an der Universit t von San Francisco mit ANTLR Die derzeit aktuelle Version ist 2 7 6 Allerdings sind die Entwicklungsarbeiten an Version 3 schon weit fortge schritten und die Ver ffentlichung liegt in naher Zukunft Charakterisierung ANTLR ist ein Framework zur Erstellung von Compilern bzw de ren einzelner Bestandteile mit besonderem Schwerpunkt auf der Unterst tzung von B umen Erzeugung Traversierung Konvertierung ANTLR liegt selbst in verschiedenen Sprachen vor und kann LL Parser in Java C und C erzeugen Dabei unterst tzt ANTLR die au tomatische Erzeugung von ASTs Deren Traversierung kann in separaten Baumgrammatiken beschrieben werden Ferner soll in Version 3 noch eine graphische Benutzeroberfl che ANTLRWorks zum Ent wickeln Debuggen und Testen von Grammatiken hinzukommen F r Java 1 5 sind auf der Homepage derzeit drei verschiedene Grammatiken verf gbar Des weiteren sind Grammatiken f r eine Vielzahl weiterer Sprachen dort abrufbar 98 C 2 Parsergeneratoren Literatur Auf der ANTLR Homepage siehe 13 steht eine umfangreiche Dokumentati on bestehend aus einer langen FAQ Tutorials einem Benutzerhandbuch einer API Beschreibung des Frameworks und zus tzlichen Ver ffentlichungen von teils wissenschaftlichen Arbeiten zum Thema Compilerbau zur Verf gung Fragen die dar ber hinausgehen k nnen in Foren sowie in einer Mailingliste gestellt werden Verwendung Bei
118. ichnet sind Charakterisierung Bei JRefactory handelt es sich um ein Tool welches Refactorings von Javaquelltexten unterst tzt Es kann als reines Kommandozeilenwerkzeug benutzt werden bringt aber auch eine eigene Oberfl che mit Ferner existieren PlugIns f r diverse IDEs die Java unterst tzen Interressant f r uns sind allerdigs nicht die Refactoring Funktionen sondern der intergrierte Javaparser Dieser wird als separates Paket zum Download angeboten Dabei handelt es sich um einen Parser der auf einer eigenen JavaCC Grammatik basiert Diese soll auch Sprach konstrukte aus Java Version 5 kennen und einen AST erzeugen So behandeln wir im Rest des Abschnitts nur den Javaparser genauer Literatur Zu JRefactory existiert keine wirklich brauchbare Dokumentation Die Homepa ge siehe 29 beschr nkt sich eigentlich nur auf eine Beschreibung der Features 104 C 3 Werkzeuge die Parsergeneratoren benutzen Verwendung Aufgrund der o a Dokumentationslage zogen wir die Dokumentation von JavaCC hinzu und konnten feststellen dass der Parser in ein separates Programm eingebunden werden muss welches die Vorbehandlung der Eingabedaten und das Ansto en des Parsings bernimmt Eigene Erfahrungen Da der Parser in einem vorkompilierten JAR Paket geliefert wird entf llt die Erzeugung mit JavaCC Es wird zwar explizit darauf hingewiesen dass Informa tionen zur Benutzung auf der Homepage verf gbar seien leider 1st dies nicht der Fall
119. ie Quelltexte sind als Open Source frei verf gbar Seit Ende 1999 wird CUP von der Technischen Universit t M nchen siehe 25 gepflegt und weiterentwickelt Verantwortlich f r die aktuellste Version 0 11a Mai 2005 ist dort Michael Petter Charakterisierung CUP ist ein javabasierter LR 1 Parsergenerator der ebenfalls java basierte Parser erzeugt Auf der Homepage von CUP sind neben Grammatiken f r eine Viel zahl von Sprachen auch welche f r die Java Sprachversionen 1 0 bis 5 verf gbar CUP er stellt aus den Grammatiken nur einen Parser Scanner Lexer kann dieses Werkzeug nicht er zeugen Ein passender Scanner Lexer kann wahlweise von Hand geschrieben oder mit anderen Scannergeneratoren erzeugt werden Dazu bietet CUP ein Interface f r javabasierte Scanner unterst tzt aber im Besonderen JLex und JFlex Auch im Falle von CUP geschieht die Baumerzeugung durch die generierten Java Parser nicht automatisch Diese Funktionalit t muss wie auch in JavaCC Grammatiken als Aktionscode in die Produktionen der Grammatik eingebaut werden Literatur Die Dokumentation zu CUP ist leider nur sehr sp rlich Es wird lediglich ein kur zes Benutzerhandbuch mitgeliefert welches die Erstellung von Grammatiken und die Erzeu gung eines Parsers mit CUP behandelt Auf der Homepage existiert weiterhin ein Merkblatt welches die Erstellung von CUP mit Ant beschreibt Dar berhinausgehende Fragen k nnen per E Mail an den Verantwortlichen gestellt wer
120. ie vom Symbol abstammt e Rollen Aggregierte Klassen die von einem Symbol der rechten Regelseite abstammen sind mit einer Rolle relativ zur aggregierenden Klasse zu annotieren Schl sselworte werden zu Rollen f r die Klassen vor deren Ursprungssymbol sie stehen Abbildung 44 und Listing 48 verdeutlichen die Heuristiken an einem Beispiel bic d e e Listing 48 Beispielgrammatik a c Abbildung 44 Umsetzung der Grammatik aus Listing 48 n ein Modell F 1 2 Entwurf und berarbeitung des Metamodells Da die Entwicklung des Metamodells nicht an einem Tag geschah sondern viele kleine Schrit te ben tigte haben wir eine Versionierung eingef hrt Jede u a Version des Metamodells entspricht einem Ausdruck der zu den Treffen den Betreuern vorgelegt wurde 156 EI Vorgehensweise V1 Nachdem die o a Heuristiken m glichst konsequent angewandt wurden erhielten wir die erste Fassung des Metamodells Die meisten Regeln und Symbole waren in Generalisierungs und Aggregationsstrukturen des Diagramms als Klassen vertreten Auch die ermittelten Mul tiplizit ten waren in den meisten F llen zutreffend Insgesamt war die Strukur des Metamodells jedoch un bersichtlich und kompliziert und lehn te sich noch zu stark an die Syntax von Java an Dies lag an der bedenkenlosen bernah me von m glichst vielen Regeln und Symbolen um ein m glichst vollst ndiges Metamodell zu erhalt
121. ier erkennen und mit Unicode Escapesequenzen umgehen k nnen F r die Unicode Unterst tzung wird ein in C f r NET 2 0 geschriebener Pr pro zessor mitgeliefert Um diesen benutzen zu k nnen mussten wir zun chst einmal ein klei nes Kommandozeilenprogramm schreiben welches die Pr prozessor Klasse benutzt und die Eingabedateien verarbeitet Der Lexer und der Parser lieben sich zwar erzeugen jedoch lief sich ersterer nicht kompilieren da an zwei Stellen im Javaquelltext Char IsLetter bzw Char IsLetterOrNumerical erzeugt wurden Nach manuellem Ersetzen durch Charac ter isLetter bzw Character isLetterOrNumerical siehe API Beschreibung von Java 5 war eine Kompilierung m glich Allerdings konnten wir den Parser nicht testen da dieser an den von uns korrigierten Stellen abbrach 99 C Dokumentation der Onlinerecherche Position amp L nge der Tokens im Quelltext Laut API Beschreibung l sst sich die Position des Tokens im Quelltext nicht direkt abrufen Lediglich Zeile Spalte und L nge ber die L nge des Strings des Tokens sind einsehbar Es w re aber m glich die Klasse Token abzuleiten und dort die Position einzubauen Dazu m sste allerdings noch der Lexer angepasst werden damit dieser die Position auch in das Token eintr gt Die Knoten des AST von ANTLR enthalten eine Referenz auf das Token Somit ist ein Abruf der ben tigten Eigenschaften auch nach dem Parsing m glich P
122. interfaceDefinition enumDefinition annotationDefinition declaration modifiers typeSpec variableDefinitions typeSpec qa classTypeSpec builtInTypeSpec classTypeSpec classOrInterfaceType dl ik SC classOrInterfaceType c IDENT typeArguments IDENT typeArguments typeArgumentSpec 7 classTypeSpec builtInTypeArraySpec typeArgument pS typeArgumentSpec wildcardType wildcardType 75 2 typeArgumentBounds typeArguments t 5 typeArgument typeArgument typeArgumentsOrParametersEnd 167 F Entwicklung eines neuen Metamodells 64 65 e typeArgumentsOrParametersEnd 67 68 de a 69 SS 70 71 2 typeArgumentBounds 73 De extends super classOrInterfaceType 74 75 6 builtInTypeArraySpec 77 builtInType I 78 SI 79 so builtInTypeSpec M builtInType 82 83 type 85 classOrInterfaceType builtInType 86 s builtInType 89 void 90 boolean 91 byte 92 char 93 short 94 int 95 float 96 long 97 double 98 99 mn Identifier 101 ES IDENT IDENT 102 103 i4 1dentifierStar 105 TE IDENT 106 IDENT 107 c Cams d 168 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
123. ion x to TraditionalForClause 1 1 82 3410 VertexClass ForEachClause ForHead sal EdgeClass IsParameterOfForEachClause IsParameterOf from ParameterDeclaration 1 1 to ForEachClause 1 1 342 EdgeClass IsEnumerableOf AttributedEdge from Expression 1 1 to ForEachClause 15135 343 VertexClass EmptyStatement Statement 345 346 VertexClass While Statement 347 EdgeClass IsLoopBodyOfWhile IsLoopBodyOf from Statement 1 1 to While 1 1 348 EdgeClass IsConditionOfWhile IsConditionOf from Expression 1 1 to While 1 1 349 350 VertexClass DoWhile Statement 31 EdgeClass IsLoopBodyOfDoWhile IsLoopBodyOf from Statement 1 1 to DoWhile 1 1 32 EdgeClass IsConditionOfDoWhile IsConditionOf from Expression 1 1 to DoWhile 1 Ka 353 ssa VertexClass Break Statement 355 EdgeClass IsBreakTargetOf AttributedEdge from Label 1 to Break 1 1 356 351 VertexClass Continue Statement 358 EdgeClass IsContinueTargetOf AttributedEdge from Label 1 to Continue 1 1 359 30 VertexClass Return Statement 31 EdgeClass IsReturnedBy AttributedEdge from Expression 1 to Return 1 1 362 33 VertexClass Switch Statement 34 VertexClass Case Statement e VertexClass Default Statement 36 EdgeClass IsSwitchArgumentOf IsArgumentOf from Expression 1 1 to Switch 1 1 el EdgeClass IsCaseOt AttributedEd
124. ion 0 x to Vertex 1 1 abstract EdgeClass IsArgumentOf AttributedEdge from Vertex 0 to Vertex 1 1 abstract EdgeClass IsConditionOf AttributedEdge from Expression 1 to Vertex 1 1 abstract EdgeClass IsExceptionThrownBy AttributedEdge from TypeSpecification O to Member 1 1 abstract EdgeClass IslnterfaceOf AttributedEdge from TypeSpecification x to Type CET abstract EdgeClass IsSuperClassOf AttributedEdge from TypeSpecification 1 to Type 1 1 abstract EdgeClass IsLeftHandSideOf AttributedEdge from Expression 1 1 to Expression 1 1 abstract EdgeClass IsRightHandSideOf AttributedEdge from Expression 1 1 to Expression 1 1 abstract EdgeClass IsLoopBodyOf AttributedEdge from Statement 1 1 to Statement Kl E abstract EdgeClass IsModifierOf AttributedEdge from Modifier x to Vertex 1 1 abstract EdgeClass IsParameterOf AttributedEdge from ParameterDeclaration 0 to Vertex 1 1 abstract EdgeClass IsStatementOf AttributedEdge from Statement x to Vertex 1 1 abstract EdgeClass IsTypeOf AttributedEdge from Vertex 0 to Vertex 1 1 abstract EdgeClass IsTypeParameterOf AttributedEdge from Vertex to Vertex 1 1 abstract EdgeClass IsBlockOf AttributedEdge from Block 1 1 to Vertex 1 1 9 ON Ke oo 10 10 10 10 10 E
125. iplikation Klammern und die nat rlichen Zahlen verwen den entwickelt werden Dabei sollen alle drei Grammatikarten Lexer Parser und Treeparser zum Einsatz kommen Aus Grund der bersichtlichkeit Tokens und Tokenreferenzen in allen Grammatiken komplett eroDgeschrieben zus tzlich werden Schl sselworte unterstrichen E 2 1 Lexergrammatik Zun chst wird der Lexer definiert F r alle zu erkennenden Symbole m ssen die jeweils zu erzeugenden Token definiert werden Neben den o a Elementen sollen auch Leerzeichen Tabulatoren und Zeilenumbr che verarbeitet werden k nnen Die Lexergrammatik in Listing 40 soll dies leisten class ExprLexer extends Lexer options k 2 Lookahead f r Zeilenumbr che charVocabulary 2 Nu0000 u007F ASCII LPAREN RPAREN PLUS FL MINUS STAR x INT m ROTE IE s WS 57 D Xp Yap An lt setType Token SKIP Listing 40 Lexergrammatik f r Taschenrechner aus calculator g Nach der letzten Produktion steht eine semantische Aktion Diese stellt den Typ des Tokens WS auf SKIP damit der Parser dieses sp ter fallen l sst und zum n chsten bergeht 149 E Detaillierte Funktionsweise von ANTLR E 2 2 Parsergrammatik In der Parsergrammatik wird die Syntax der zu akzeptierenden arithmetischen Ausdr cke fest gelegt Es m ssen dazu dieselben Tokens wie in der Lexergrammatik benutzt werden class ExprParser extend
126. iuouupu ss JOJ403IuOINS eziuouupu s x ojg 6 6 170 I I u 3e2Jo Apoas youond xmubne si Ayjeul430Apogs I I uojssaidx3 Ey ue og x I I JOJe JpueHs Jouonde x3uwoJuls fajoApogs fa E quawajeys C 26 uoissa4dx3 I T To 9sejjnejeqjo1ueuregeiss jouonipuo5ese5s 5 1 1 5 I I I gpeuungeus ynejoq ose 170 JOYUSUUINBIYUIIMSS JOsse inejeds 10956351 I T L I wuowsgers ydwg ypums 6 Abbildung 16 Metamodell Teil 9 12 56 CH E yous uins eya 6uo1 Joynaysuopanijdxe 1032nu3suo4edns b nu 1 320 14 Joyonugsuoo pougejw4edns poyu ueajoog sedA ajqissod sed uone oAu POU lqissod sedAjuning d4 a Buijs eueu a Bugs aueu a uoge ypedsedA Ey uojsse4dx3 edA1u ning uojsseudx3 sequia seynuep E uojsseudx3 s unu pi uojsse4dx3 uogerejegpred T e TO TO ge T T T xr 1t j En T uone2oau IPPOYIOWJOFUBUINBIYS pou3 vip yoAu gO3SUJeNS JO12efqope1se5s1 30 gt dA Lu 5 251 POYIOWPSINOAU gouoneaej eqs yox pu nueurs 3Aeuys JOJeuiequo piers JOUIIEWS JO9UIENDISHS JO9d LpaJse3s1 5 251
127. k private final Suit suit private Card Rank rank Suit suit if rank null suit null throw new NullPointerException rank suit this rank rank this suit suit public Rank rank return rank public Suit suit return suit public String toString return rank of suit public int compareTo Object o Card c Card o int rankCompare rank compareTo c rank return rankCompare 0 rankCompare suit compare To c suit private static List sortedDeck new ArrayList 52 C 7 Javaquelltexte f r Tests 119 C Dokumentation der Onlinerecherche 115 116 BROKEN IN PROTOTYPE 2 0 aL MM us Ai Auskommentiert da der Compiler Rank VALUES und n l Suit VALUES nicht kennt 120 III IO III OO OOOO RIOR MM 121 static 122 f 123 for Rank rank Rank VALUES 1241 Ai for Suit suit Suit VALUES 125 Ai sortedDeck add new Card rank suit 126 Ai 127 M M 128 amp x 129 130 Returns a shuffled deck 131 public static List newDeck 132 133 List result new ArrayList sortedDeck 134 Collections shuffle result 135 return result 136 i end of class Card 39 sophisticated example 140 I M 1111 abstract auskommentiert da fuer enum nicht zulaessig 142 MIMI public static abstract enum Operation 144 145 plus 146 147 double eval double x double y 148
128. l muss dies in der Methode isTypeName implementiert sein Semantische Pr dikate k nnen auch zum eindeutig machen von mehrdeutigen Grammatiken verwendet werden Die beschriebene Syntax in Listing 32 w re unter LL k mit k 2 nicht determiniert da beide Produktionen mit dem Token ID beginnen Die erste repr sentiert eine Deklaration wie int i und die zweite eine Zuweisung wie i 5 Mit dem vorangestellten semantischen Pr dikat kann jedoch unterschieden werden welcher Fall zutrifft Basiert das Token ID auf einem Typnamen dann ist die Bedingung erf llt und die erste Produktion wird angewand Basiert es nicht auf einem Typnamen so handelt es sich um eine Zuweisung und die zweite Produktion findet Verwendung Durch den Aufruf der Methode LT 1 wird das n chste Token abgerufen also ein Lookahead von 1 141 E Detaillierte Funktionsweise von ANTLR stat isTypeName LT 1 ID ID Deklaration ID expr Zuweisung Listing 32 Regel mit semantischem Pradikat Syntaktische Pradikate Beim syntaktischen Pr dikat formuliert die Bedingung eine zu erkennende Syntax Zum Festlegen dieser wird ein daraus folgt gt verwendet In Listing 33 formuliert die Bedingung dass ein Symbol 1ist von einem Gleich 2 gefolgt werden muss damit diese erf llt ist Analog zum validierenden semantischen Pr dikat wird dann die erste Produktion gew hlt sonst die zweite stat C Tier e je list list list
129. lassen dieses Packages erben von ihr Konkrete Factories Folgende Liste f hrt auf f r welche Quellcodeelemente die jeweili ge Klasse die entsprechenden Teilstrukturen im TGraph generiert Die Klassen sorgen auch daf r dass semantisch identische Knoten nur einmal im TGraph vorkommen sofern dies zu Zeitpunkt des Aufbau des TGraphen eindeutig entscheidbar ist e AnnotationFactory Annotationen und Annotationsfelder 28 6 5 Package javaextractor resolvers ConstantFactory null boolean float double int long char und String Literale ExpressionFactory Konstruktor und Methodenaufrufe Typumwandlungen Pr fix Infix und Postfix Operator Ausdr cke sowie Array und Objekt Instanziierung FieldFactory Deklarationen und Zugriffe auf Felder Variablen und Enum Werten IdentifierFactory einfache Bezeichner ImportFactory Importdefinitionen MemberFactory Konstruktor und Methodendefinitionen sowie Methodendeklara tionen ModifierFactory Modifizierer PackageFactory Packagedefinitionen QualifiedNameFactory qualifizierte Bezeichner StatementFactory Labels sowie If For While Do While Break Continue Return Switch Try Throw Synchronize und Assert Anweisungen TypeDefinitionFactory Klassen Schnittstellen Enum und Annotationsdefi nitionen TypeParameterFactory Typparameter und argumente TypeSpecificationFactory Typspezifikationen 6 5 Package javaextractor resolvers Dieses Package e
130. lean sethlethodResolwenhlethodResolver woid usez Method Resolver MethodResolvemSymbolT able resolwe hi etho ds Exiractiunhiade boolean resalveSingleMethod ExtractionModse Methodinvocation woid setFieldResolvenFieldResolver woid uses Rezalver Ltilitiez accessedDimenzionzhatchDeclaredDimensionzFieldA amp ccess ArayType boolean create ndAatachEnumbonstantiObjecdt Type Eztractionhinde SymbolT abled woid ereateAndAttachFieldaField Type Extractiontlode SymbolT able vaid create ndAtachhlodifieriint vertex SymbolT able void cre ate ConstructorDefinition Constructor Type Extractionhdade SymbolT abled Constructorbefinition createEnumConstantObject Type SymbolTablal EnumConstant createfieldDeclarationiField Type Extractiontdode SymbolTablej void cre atehlethodbeclaration rbefinitionehlethod Type Extractionhade SymbolT abled MethadDbeaclaratiaon create Type Class Extractiontilode SymbolTabley Type create Type Specification Class d s SymbolTable Extractionhdade TypeSpecifisation create TwpellzingReflection String Extractionhdadae SymboalTablej boolean etC astedTwpeFromClassC astiClassC ast Type etEnclaszingClassFramsSeopervertex SumbolT able Classbefinition etEnclazingTwpeFramSceopervsertex SumbolT able Type getFullyQualifiedNameilmp rbefinition String etimportsFromSupreme Type Type ArrayList Imporbefinition etO Create TypeBloch Type SymbolT abl
131. leitet sind repr sentieren Feld Methoden und Konstruktordeklarationen e Statement Knotentypen die von diesem abgeleitet sind repr sentieren Anweisun gen wie if while try catch usw e Expression Knotentypen die von diesem abgeleitet sind repr sentieren Ausdr cke wiea b c e Annotation dieser Knotentyp repr sentiert Annotationen an Package Klassen und Methodendefinitionen e Comment Davon abgeleitete Knotentype repr sentieren einzeilige und mehrzeilige Kommentare sowie Javadoc Kommentare QualifiedNane repr sentiert qualifizierte Namen im Quelltext wie java util Vector Die Knotentypen sind in Anhang A zu finden 5 4 3 Kantentypen Kantentypen werden im Metamodell durch einfache benannte Assoziationen repr sentiert Die Leserichtung der Kantennamen ist dabei immer von unten nach oben Die Kantennamen sind so gew hlt dass durch sie klar ist welcher Knotentyp an ihrem Ende h ngt Beispielsweise wird durch eine von einem Modifizierer ausgehende Kante IsModifierOfClass ersicht lich dass diese Kante auf eine Klassendefinition zeigt Alle Kantentypen welche einen direkten Bezug zur Syntax von Quelltextes aufweisen basie ren auf der Basistyp Att ributedEdge Diese Kanten besitzen Attribute zur Speicherung Diese sind als abstrakt deklariert und basieren ihrerseits auf dem allgemeinen JGraLab Knotentyp Vertex 22 5 4 Eigenes Metamodell f r Java 5 der Positioninformationen welche sich auf
132. licht und seitdem bis auf die aktuelle Version 3 1 2 vom 18 01 2006 entspricht 1n Version und Datum dem Eclipse Paket selbst weiterentwickelt wobei bereits die Arbeiten an der n chsten Version 3 2 x im Gange sind Charakterisierung Das Paket Java Developer Tools siehe 35 beinhaltet die Kompo nenten zur Java Entwicklung unter Ecplise und ist seinerseits in das Core Debug und User Interface Paket unterteilt Dabei beinhaltet das Core Paket u a Funktionalit ten zur Repr sen tation von Javacode als AST inklusive Grammatik und Parser Seit Version 3 1 0 unterst tzt JDT Core auch Java5 In 10 werden Funktionalit ten des Refactorings auf dem AST des JDT aufgebaut Dabei sind Modifikationen im AST m glich welche dann wieder auf den zugrunde liegenden Code bertragbar sind Dazu sind Positionsangaben der einzelnen Codelemente im AST gespeichert anders w re diese Funktionalit t wohl kaum realisierbar Aufgrund der Auslegung der JDT hinsichtlich der reinen Verwendung als Eclipse Plugin ist es ohne gr eren Aufwand und vor allem ohne Eingriff in den Code der JDT selbst nicht m g lich einen darauf aufbauenden Extraktor f r Java zu implementieren welcher ohne Eclip se und als Kommandozeilen Programm eigenst ndig lauff hig w re Einer Implementation des Extraktors seinerseits als Eclipse Plugin st nden jedoch keinerlei technischen H rden im Weg Verwendung Die Funktionalit ten von JDT Core sind nicht direkt als eigene
133. lnicht in den Quelltexten der geparsten Dateien definiert 38 7 4 Aufwandsbetrachtung so wird ein Knoten zur Repr sentation der Definition erzeugt um den Knoten der die Refe renz repr sentiert per entsprechender Kante zu verbinden Mit diesem Modus wird ein Graph erzeugt in dem ersichtlich ist ob eine Referenz im Rahmen der geparsten Klassen bleibt oder externe Elemente wie z B Java API ber hrt Erkennbar ist dies an den Elementen die eine Definition im Graphen repr sentieren Besteht die Repr senta tion nur aus einem einzigen Knoten so konnte die entsprechende Referenz nur per Reflection aufgel st werden Besteht die Repr sentation aus mehreren Elementen z B ganze Klassensi enatur so konnte die entsprechende Referenz im Rahmen der geparsten Quelltexte aufgel st werden Referenzen die berhaupt nicht aufgel st werden konnten sind 1m Graphen mit kei ner Definition verbunden Dieser Modus sollte benutzt werden wenn Referenzen zu externen Klassen bei der Analyse des Softwareprojekts von Belang sind jedoch dar berhinaus keine Analyse n tig ist Au er dem kann festgestellt werden ob im geparsten Softwareprojekt Klassen fehlen In diesem Mo dus k nnen nur solche Felder und Methoden nicht aufgel st werden die in einer nicht direkt referenzierten Oberklasse einer direkt im Quelltext referenzierten Klasse definiert sind COMPLETE In diesem Modus verh lt sich der Javaextraktor zun chst wie im Modus EAGER Es wer
134. lung der Kommandozeilenwerkzeuge Da aber auch keine Gram mat ken dabei s nd entf llt der Test der Werkzeuge Allerdings werden auf der Homepage auch diverse Demoparser f r eine Reihe von Sprachen zum Download angeboten Im Weiteren haben wir den Java 5 Parser genauer untersucht Literatur Auf der Homepage sind neben ausf hrlichen Benutzerhandb chern zu allen Werkzeugen auch FAQs Tutorials und Forschungsver ffentlichungen verf gbar Eine API Beschreibung ein Forum oder eine Mailingliste gibt es nicht 96 C 2 Parsergeneratoren Eigene Erfahrungen Da der Demoparser mit einer Benutzeroberfl che ausgestattet ist f llt dessen Benutzung denkbar einfach aus Nach dem ffnen einer Datei zeigt dieser den AST des Quelltextes an und meldet eventuelle Parsingfehler Position amp L nge der Tokens im Quelltext Zu diesem Thema waren in der Doku mentation keine Informationen zu finden In dem Demoprogramm wird aber ersichtlich dass die Position als Zeile und Spalte in den Knoten des AST aufgenommen wird Parsingtests Das Parsen der fehlerfreien Quelltexte geschieht fast problemlos Einzig die Klasse Test15 bereitet dem Parser Schwierigkeiten teilweise f hrte dies sogar zum Absturz des Programms Beim Parsen der fehlerhaften Quelltexte findet der Parser nur den nicht mehr erlaubten for each in Ausdruck Die abstrakte Enum Konstruktion und ung ltige Modi fierkombinationen bemerkt der Parser nicht Die Parsingte
135. maBstab s String Anderungsma stab gar keiner int francais 69 fran ais Listing 17 TestUnicodeClassAnd VariableNames java class EscapeS u00e4qu u00e4nz EscapeS qu nz char 140009 this literal is valid nderungsma stab String u0OcAnderungsma u00dfstab gar keiner int franu00e7ais 69 francais Listing 18 TestUnicodeEscapeSequenceClassAndVariableNames java 133 E Detaillierte Funktionsweise von ANTLR E Detaillierte Funktionsweise von ANTLR E 1 Grundlagen Dieser Abschnitt beschreibt die grundlegende Funktionsweise von ANTLR den strukturellen Aufbau der Grammatiken und die Elemente der ANTLR Metasprache sowie die Umsetzung dieser in Javaquelltext E 1 1 Funktionsweise von ANTLR ANTLR ist ein Parsergeneratoren es erzeugt aus einer Grammatik einen Parser Im Gegensatz zu den meisten anderen Generatoren kann ANTLR jedoch ohne Umwege auch zum Parser passende Lexer und Treeparser erzeugen Es ist dazu nicht n tig weitere Zusatzprogramme zu Hilfe zu nehmen wie es beispielsweise bei CUP der Fall ist Grunds tztlich gilt dass f r Lexer Parser und Treeparser jeweils eine Grammatik geschrieben werden muss Dabei kann der Benutzer frei w hlen welche er realisieren will Braucht er beispielweise nur einen Lexer so muss er nur die Lexergrammatik schreiben Da ANTLR dem Paradigma der Objektorientierung folgt ist es auch m glich die
136. mehr als ein Kriterium nicht so wurde es ausgeschlossen Kriterien die zum Auschluss f hrten sind in der Tabelle fett geschrieben Werkzeuge die in die n here Auswahl kamen stehen in einer grau hinterlegten Zeile Keines der betrachteten Werkzeuge kann alle geforderten Kriterien vollst ndig erf llen In die n here Auswahl kamen sechs Werkzeuge GCJ wurde ausgeschlossen da gen gend javaba sierte L sungen zur Auswahl standen Die Grammatik von JavaCC h tte korrigiert und jene Zum Zeitpunkt der Onlinerecherche war Suns Javacompiler javac noch nicht als Open Source freigegeben Daher wurde dieser nicht untersucht 3 Onlinerecherche nach einem Javaparser Parser in Java Position und L nge eines Token abrufbar Parsing von Java bis Version Parsingtests bestanden Quelltexte frei verf gbar Dokumentation aktives Projekt IReFactory ja 5 ja keine nein ja Or ja 5 nen ja niedrig ja nein Get ja 1141 ia miel ja ja Cocktail ja 5 mein meim niedrig ja ja abstract L ja niedrig nein ja map ja 14 ja sehrhoch ja ja o Jeje ha aji TavaEspres 1a 110 a mini nein T mr see aja Tabelle 1 bersicht der untersuchten Werkzeuge 10 3 2 Ergebnis der Onlinerecherche von FUJABA und Coco R f r Java 5 aktualisiert werden m ssen Bei den Java Development Tools schien eine Trennung von Eclipse nur sehr schwer m glich der Javaextraktor h tte als Eclipse Plugi
137. men die vom Parser erzeugt werden Er beinhaltet nachdem in der zugrundeliegenden Grammatik alle dazu n tigen semantischen Aktionen eingef gt wurden die Funktionalit t zum Umsetzen der AST Struktur in den TGraphen sowie dem F llen der Symboltabelle mit den n tigen Informationen zum sp teren Aufl sen der Quelltextreferenzen JavaTreeParserTokenTypes Diese Schnittstelle legt alle Arten der im AST verwende ten Elemente fest und wird ebenfalls durch ANTLR aus der Treewalker Grammatik erzeugt 6 2 Package javaextractor adapters Dieses Package enth lt all jene Klassen welche die Anpassungen kapseln die f r die Funk tionalit t der Positionsabfrage von Sprachelementen aus dem Quelltext notwendig sind Der Implementierung der Klassen liegt das Adapter Pattern siehe 7 auf den Seiten 139ff zu grunde CommonTokenAdapter Diese Klasse implementiert ein Token welches seinen Offset kennt und bietet Methoden die zum Speichern und Abrufen der Positionsinformationen des Tokens dienen LexerSharedinputStateAdapter Diese Klasse dient dem Lexer zur Verwaltung des Ein gabestroms der aktuell geparsten Datei Es kennt die aktuelle Position im Eingabestrom in Form eines Offsets und kann alle Positionsinformationen in ein Token vom Typ CommonTokenAdapter schreiben 25 6 Entwurf JawaExtractor Graph Builder main 5Strin void finalizecraph Extractionhdade woid GraiphBuildenString Logger parseFileziVectorz String gt woid s
138. men von links nach rechts Also einen Subbaum mit dem aus der Tokenreferenz re sultierenden AST Knoten als Wurzelknoten Ein Ausrufezeichen hingegen weist den Parser an keinen entsprechenden AST Knoten zu erzeugen und auch nicht in den Baum aufzuneh men Alle anderen Elemente d h Regelnamen linke Seite werden dann automatisch auch als AS T Knoten in den Baum aufgenommen Dabei werden f r die Symbole auf der rechten Seite auch von links nach rechts entsprechende Kinderknoten angehangen Die Struktur eines AST f r ein einfaches Beispiel ist in Abbildung 43 ersichtlich 153 E Detaillierte Funktionsweise von ANTLR Die Treeparser Grammatk welche die arithmetischen Ausdr cke auswertet beginnt mit ei nem Optionsteil der den Treeparser anweist die Tokens des o a Lexer und Parser zu berneh men Die Treeparser Grammatike f r das Taschenrechnerbeispiel wird in Listing 46 dargestellt class ExprTreeParser extends TreeParser options mportVocab ExprParser j expr returns int r 0 int a b PLUS b expr r a b MINUS a expr b expr r a b j STAR b expr r axb 1 INT r int Integer parselInt 1 getText Listing 46 Auswertung des Ausdrucks mit semantische Aktionen in der Treeparser Grammatik Eine Besonderheit der Treeparsergrammtik ist die Raute Eine Raute veranlasst einen oder mehrere Abstiege im Baum Die Regel PLUS expr expr matched nu
139. mmern anzuh ngen Soll eine Option nur f r ein Symbol gelten so muss vor diesem das Schl sselwort opt ions mit den gew nschten Optionen in geschweiften Klammern und einem nachgestellten Doppelpunkt stehen Ferner m ssen Optionsteil und Symbol in einem Klammerpaar eingefasst sein type options defaultErrorHandler false classOrInterfaceType builtInType Listing 28 Option f r die Regel type ID a z options greedy true WS Listing 29 Option f r das Symbol WS Whitespace Semantische Aktionen Beieiner semantischen Aktion handelt es sich um ein Quelltext fragment in der Zielsprache Es muss in geschweiften Klammern eingefasst werden und wird unver ndert in das zu erzeugende Programm kopiert Somit wird es zu dem Zeitpunkt ausge f hrt an dem der erzeugte Parser intern die Stelle erreicht an der analog in der Grammatik die semantische Aktion definiert wurde Erlaubt sind diese Aktionen auf der linken Seite un mittelbar vor dem Doppelpunkt diese wird somit immer ausgef hrt auf der rechten Seite an beliebiger Stelle die Ausf hrung h ngt von der Produktion ab In den semantischen Aktionen 140 EI Grundlagen ist das Wort return nicht erlaubt da es schon von ANTLR als Schl sselwort f r ein R ck gabeargument belegt ist Will man dennoch in Java und C Methoden mit return nutzen so m ssen diese im Abschnitt f r eigene Methoden der Grammatik formuliert werden In Listing 30 wi
140. n this super assignmentExpression builtInType y class class 581 582 583 584 585 586 587 588 589 590 591 s2 identPrimary 593 t typeArguments 594 IDENT 595 typeArguments IDENT 596 argList UU b 3 597 598 599 600 so newExpression 602 de new typeArguments type 603 argList classBlock 604 newArrayDeclarator arrayInitializer 605 606 607 180 E2 Javagrammatik aus ANTLR es argList 609 expressionList xnothing x 610 611 e newArrayDeclarator 613 TE T expression expression 614 615 66 constant 617 5 NUM INT CHAR LITERAL 618 619 STRING_LITERAL 620 NUM_FLOAT 621 NUM LONG 622 NUM DOUBLE 623 Listing 50 Beispiele f r die drei erlaubten syntaktischen Konstruktionen rotmarkiert einer TypeParameterDeclaration 181 Literatur Literatur 1 Aho Alfred V Ullman Jeffrey D 1977 Principles of Compiler Design Dritte Auflage Reading Massachusetts Addison Wesley 1979 ISBN 0 201 00022 9 2 Bildhauer Daniel 2006 OGuPro Sourcecodebrowser mit Unterst tzung von Folding Syntaxhighlighting und graphbasierter Navigation Zugl Koblenz Univ Studienarbeit 2006 3 Bildhauer Daniel 2006 Ein Interpreter f r GReOL 2 Entwurf und prototypische Implementation Zugl Koblenz Univ Dipl 2006 4 Bornstein Dan 200
141. n e localrepository javaextractor aus dem Online Repository abgelegt mittels svn checkout Abbildung 7 zeigt die auf wesentliche Verzeichnisse reduzierte Verzeichnisstruktur Alle weiteren Schritte werden ausgehend vom Verzeichnis localrepository javaextractor src durchgef hrt 2 Danach m ssen folgende Verzeichnisse und Dateien in den CLASSPATH aufgenommen werden e Das aktuelle Verzeichnis e Das Verzeichnis mit den Quellen von JGraLab wal e Jgralab sre e Das von JGraLab teilweise verwendete GetOPT common lib getopt java getopt 1 0 13 jar e Das vom Extraktor verwendete ANTLR Mos common 11b antlr orfg antle 2 7 6 Jar Am einfachsten geschieht dies durch Setzen einer entsprechenden Umgebungsvariable Die Alternative mittels bergabe des Java Kommandozeilenparameters cp bei Kom pilierung und Ausf hrung ist auch m glich hier wird jedoch ersteres angenommen im Verzeichnis localrepository javaextractor src javaextractor er zeugt werden Die Erzeugung geschieht durch die folgenden zwei Aufrufe Anschlie end m ssen Lexer Parser und Treewalker aus ihren Grammatiken durch ANTLR 6 1 Erzeugung java antlr Tool o yavaextractor javaextractor javal5 g java antlr Tool o yavaextractor javaextractor javal5 tree g 4 Dann m ssen JGraLab und das darin enthaltene Programm TGSchema2Java zur Ge nerierung von Graphklassen aus einem Schema ebenfalls kompiliert werden javac jgralab src de uni koble
142. n wie in C getrennt geschehen Semantik In das Metamodell sind auch Designentscheidungen eingeflossen die nicht di rekt das Modell sondern den Javaextraktor an sich betreffen da sie nicht vollst ndig durch die Semantik des Metamodells abgedeckt werden Dazu z hlen e Behandlung des super eines Aufrufs einer Supermethode z B super toString als Identifier der ber eine Kante isIdentifierOf mit der Superklasse ver bunden ist e H herbewertung des Package als TranslationUnit da in Java ein Programm ein Package sein sollte welches wiederum aus Packages bestehen kann Attribute Durch Attribute konnten unter anderem viele unn tigen Klassen eingespart werden die aus syntaktische Einschr nkungen der Grammatik stammten Folgende Attribute haben wir eingef hrt e String Attribute ordnen den Klassen ihre Bezeichner zu name in Identifier fullyQualifiedName in QualifiedName und seiner Subklasse Type und seinen Subklassen z B ClassDefinition JavaPackage e Integer Attribute ordnen den Klassen ihren Ursprung aus Java in einer Enumeration zu type in Modifier 165 F Entwicklung eines neuen Metamodells type in BuiltInType prefixOperator in PrefixExpression analog f r InfixExpression und PostfixExpression e Boolean Attribute ersetzen Generalisierungen superMethod und constructorMethod in MethodInvocation Die StringConstantExpression besitzt ein Attribut
143. n Statement und alle Ausdr cke direkt von Expression abgeleitet Dann wurden alle Operatoren n den Klassen PrefixExpression InfixExpression und PostfixExpression als Enumerationen zusammengefasst siehe Abbildungen 2 und 3 Insgesamt sorgte dies be reits f r ein bersichtlicheres Modell Anschlie end wurde nach aussagekr ftigen Bezeichnern f r Klassen und den noch vertretenen Rollen gesucht Danach waren erheblich mehr Java Termini im Metamodell vertreten und die Namen bezeichnender 157 F Entwicklung eines neuen Metamodells 9 postFixExpression 1 1 1 primaryexpression postfixexpressionpart1 postcrement 1 0 1 primaryExpression 3 postFixExpressionPart1 3 postCrement t islncrement Boolean postFixExpressionPart2 3 postFixExpressionPart3 3 postFixExpressionPart4 postFixExpressionPart5 1 1 1 1 typeargurnents newexpression 0 1 postfixexpressionpart6 expression 1 1 1 3 typeArguments 3 postFixExpressionPart6 3 newExpression expression 3 postFixExpressionPart7 postFixExpressionPart8 3 postFixExpressionPart9 1 1 1 1 1 1 atglist E 1 arglist 3 ident arglist 0 1 1 dent 0 3 0 1 ident 3 argList 0 1 3 typeArguments 3 ident Abbildung 45 Modell der PostFixExpression aus dem Entwurf 158 EI Vorgehensweise Das Modell war nur zu einem Drittel berarbeitet jedoch dadurch schon signifikant kleiner und berschaubarer Das Klassendiagramm b
144. n realisiert werden m ssen Aufgrund des gesch tzten Anpassungsaufwands im Vergleich zu anderen Werkzeugen fiel die Wahl schlieBlich auf ANTLR Bei ANTLR war es lediglich notwendig die Funktion zur Positionsabfrage zu modifizieren Hinzu kam dass von allen untersuchten Werkzeugen das ANTLR Projekt die mit Abstand aktivste Community vorweisen konnte Das n chste Kapitel widmet sich der n heren Beschreibung von ANTLR 11 4 ANTLR 4 ANTLR Dieses Kapitel behandelt das Werkzeug ANother Tool for Language Recognition kurz ANTLR Zun chst erfolgt ein berblick ber das Projekt gefolgt von einem Abschnitt ber die Funktionsweise Zuletzt werden die Anpassungen die zur Erf llung aller gestellten An forderungen und Integration in den Javaextraktor n tig waren beschrieben 4 1 berblick Historie Die Entwicklung von ANTLR begann 1988 urspr nglich als Projekt an der Pur due Universit t West Lafayette Indiana USA damals noch unter den Namen YUCC bzw PCCTS Das Projekt wurde 1989 Inhalt der Masterarbeit von Terence Parr welcher seitdem die Schl sselfigur hinter ANTLR ist Die erste ffentlich verf gbare Version erschien 1990 und ist von jeher quelloffen Das Pro Jekt wurde kontinuierlich weiterentwickelt und Terence Parr besch ftigt sich heute noch als Professor an der Universit t von San Francisco mit ANTLR Aktuell 1st Version 3 Der Java extraktor basiert jedoch auf Version 2 7 6 da Version 3 erst w
145. nfacht die Implementierung wesentlich Gerade zur Vermeidung und Suche von Fehlern ist eine kompakte Grammatik von Vorteil Dar ber hinaus bietet die Arbeitsweise des Treewalkers eine einfache M glichkeit zum Erzeugen der TGraph Elemente da die Struktur seiner Regeln derjenigen hnelt die der generierte Graph gem dem Metamodell besitzen soll Zur Erzeugung des TGraphen ist es nicht n tig den Treewalker selbst anzupassen sondern es gen gt entsprechenden Code als semantische Aktionen in seine zugrundeliegende Grammatik einzuf gen Ein aus der modifizierten Grammatik erzeugter Treewalker beinhaltet dann die gew nschte Funktionalit t Zun chst m ssen dem Treewalker Referenzen mitgegeben werden damit dieser die zu erzeu genden Graphelemente an die richtigen Stellen im Graphen verbinden kann Diese werden mittels Setter Methoden vom Javaextraktor gesetzt bevor der AST traversiert wird Dabei handelt es sich um die folgenden Elemente e programGraph Der TGraph der erweitert werden soll e programVertex Der Wurzelknoten des Graphen e sourceUsageVertex Der Knoten im Graphen in dem der Pfad der aktuellen Quell textdatei gespeichert ist translationUnitVertex Der Knoten im Graphen der als Wurzelknoten f r alle Elemente aus der aktuellen Quelldatei dient e symbolTable Die zum TGraph geh rige Symboltabelle Die eigentliche Generierung einer Teilstruktur des TGraphen im Treewalker entspricht in den meisten F llen dem
146. ng myresult Stack TraceElement trace e getStack Trace for int i 0 i lt trace length i myresult 9 traceli toString n return myresult 130 D 5 Quelltexte This method decides what action to take based on the type of file we are looking at public static void doFile File f String basepath throws Exception If this is a directory walk each file dir within if f isDirectory 1 String files f list for int i 0 i lt files length i doFile new File f files i basepath j otherwise if this is a java file parse it else if f getName length gt 5 SA f getName substring f getName length 5 equals java 1 outputappend f getAbsolutePath substring basepath length System err print parseFile f getName new FilelnputStream f parseFile f getName new BufferedReader new FileReader f j j Here s where we do the real work public static void parseFile String f Reader r throws Exception try Create a scanner that reads from the Input stream passed to us JavaLexer lexer new JavaLexer r lexer setFilename f Create a parser that reads from the scanner JavaRecognizer parser new JavaRecognizer lexer parser setFilename f start parsing at the compilationUnit rule parser compilationUnit do something with the tree doTreeAction f parser getAST parser get TokenNames
147. ngsgrammatik orientierte So wurde das Metamodell anschlie end mehreren ber arbeitungen unterworfen Im Zuge dieser wurde eine qualitative Verbesserung haupts chlich durch eine kontinuierliche Vereinfachung des Metamodells erreicht Der folgende Abschnitt beschreibt die Heuristiken welche bei der ersten Fassung des Meta modells Verwendung fanden F 1 1 Heuristiken f r den Entwurf Das Metamodell wird durch ein Klassendiagramm in UML beschrieben Die vorgestellten Heuristiken beschreiben deshalb die Umsetzung der Elemente der Grammatik in Klassen Assoziationen Multiplizit ten etc e Klassen Nichtterminalsymbole werden zu Klassen Terminalsymbole werden weggelassen e Assoziationen Veroderungen werden zu Generalisierungen Wobei die Basisklasse auf dem Sym bol der linken Seite der Regel fut Verkettungen werden zu Aggregationen Wobei die aggregierende Klasse auf dem Symbol der linken Seite der Regel fu t e Multiplizit ten Iteration Wiederholung Symbol x werden zu 0 und alle Op tion Symbol werden zu 0 1 Symbole ohne o g Klammerungen f hren zu einer Multiplizit t von genau 1 Sind aufgrund komplizierter Grammatikausdr cke mehrere Multiplizititen m g lich gelten die kleinste untere und die gr te obere Grenze 155 F Entwicklung eines neuen Metamodells Dabei werden die Multiplizit ten am Ende der Assoziation notiert welche in der Klasse m ndet d
148. nis 7 1 Erzeugung des TGraphen im Treewalker 34 72 Sammeln und Berechnen der Positionsinformationen 35 7 3 Aufl sen der Quelltextreferenzen 36 7 3 1 Genereller Ablauf des Aufl sevorgangs 36 7 3 2 Anpassung des Graphen w hrend des Aufl sevorgangs 37 15 SAUNOSCMOAL ue ira d etr de e c Et Be e i n 38 74 Aufwandsbetrachtung 39 8 Verwendung des davaextraktors 42 zl GBIZCUPUDE ce ni A m r m t k l 5 B td nd dvd s 42 9 2 AUTE aie x oe vm dod ci A ee X o HUS ox 44 9 Abschlie ende Betrachtung 45 9 1 Umgesetzte Anforderungen 45 45 A Metamodell der Graphklassen 47 B Schema der Graphklassen 73 C Dokumentation der Onlinerecherche 85 C 0017 C ux ue s ok im dioi nct EE 85 C 1 1 Grober Ablauf der Tests 2 soo on s 85 CEZ Pars naless un Aba cesses a 77 85 CZ Parserseneraloren ae ee ern 87 27 JaC eaa abe eb a A ENS A 87 O22 EUP ee a Be a A S dd 89 E23 COCOR 4 8 4 amada ed od e qn SG ee 92 CIA MOCK ath ais Mom un E BRA en ds ne ee dec 95 55 AMER CDI 98 C 3 Werkzeuge die Parsergeneratoren benutzen 100 C 3 1 JAbstract A full Abstract Syntax and ParserforJava 103 60 JIRCIACIOLY uuu
149. npassungen notwen dig um die erw nschten Funktionen f r Lexer und Parser vollst ndig zu realisieren Die fol genden Abschnitte beschreiben diese Anpassungen 4 3 1 Anpassung Position des Tokens als Offset Die Position eines Tokens im Quelltext l sst sich mit der von ANTLR bereitgestellten Funk tionalit t nicht als Offset abrufen Lediglich Zeile Spalte und L nge ber die L nge des Token Strings des Tokens sind einsehbar Um diese Funktionalit t nachzur sten muss erst die interne Funktionsweise von ANTLR verstanden werden Tokens werden in ANTLR durch die Klasse ANTLR CommonToken implementiert Diese werden von einem Lexer erzeugt der wiederum aus einer Grammatik erzeugt wird In der Regel erben die Lexer von der Klasse ANTLR CharScanner Diese steuert die Klasse ANTLR LexerSharedInputState welche die aktuelle Position im Eingabestrom kennt und diese in die Tokens schreibt Um den Offset nachzur sten wurden Adapterklassen implementiert die von den o a Klas sen aus ANTLR erben Die neue Tokenklasse CommonTokenAdapter hat nun zus tzliche Methoden zum Speichern und Abrufen der Position als Offset Der neue LexerSharedInputStateAdapter kann mit den neuen Tokens umgehen Der neue Lexer CharScannerAdapter kann den neuen LexerSharedInputStateAdapter nutzen und auch mit den neuen Tokens umgehen Da dieser aus der Grammatik in java g erzeugt wird musste diese angepasst werden Durch Angabe von class JavaLexer extends Lexer
150. nt Is TypeOf from TypeSpecification 1 1 to SimpleArgument 1 1 57 s EdgeClass IsLowerBoundOfWildcardArgument AttributedEdge from TypeSpecification 0 1 to WildcardArgument 1 1 s EdgeClass IsUpperBoundOfWildcardArgument AttributedEdge from TypeSpecification 0 1 to WildcardArgument 1 1 160 161 VertexClass TypeParameterUsage TypeSpecification 12 EdgeClass IsTypeParameterUsageNameO f AttributedEdge from Identifier 1 1 to TypeParameterUsage 1 1 163 164 VertexClass Array Type TypeSpecification dimensions Integer is EdgeClass IsElementTypeOf IsTypeOf from TypeSpecification 1 1 to Array Typet 1 1 b 166 167 VertexClass QualifiedName TypeSpecification fullyQualifiedName String iss VertexClass QualifiedType QualifiedName Expression 159 EdgeClass IsQualifiedNameOf AttributedEdge from QualifiedName to Vertex vu EdgeClass IsNameOf AttributedEdge from Identifier O x to QualifiedName 0 x in EdgeClass IslmportedTypeOf AttributedEdge from QualifiedName 1 1 to ImportDefinition 1 1 21 EdgeClass IsTypeDefinitionOf from Type to TypeSpecification 1 1 173 val VertexClass Builtln Type TypeSpecification type BuiltInTypes 175 vel EdgeClass IsTypeParameterDeclarationNameOf AttributedEdge from Identifier 1 1 to TypeParameterDeclaration 1 1 7 EdgeClass IsUpperBoundOfTy
151. nth lt Klassen die dem Aufl sen der Quelltextreferenzen dienen Resolver Diese Klasse ist abstrakt und beinhaltet die f r alle Resolverklassen gemeinsame Funktionalit t Alle weiteren Klassen im Package mit Ausnahme von ResolverUtilities erben von ihr LocalResolver Kann Quelltextreferenzen auf lokal definierte Elemente aufl sen TypeSpecificationResolver L st Typspezifikationen auf die nicht bereits durch den LocalResolver aufgel st werden konnten 20 6 Entwurf FieldResolver Implementiert Methoden zum Aufl sen von Zugriffen auf Variablen Felder und Enum Konstanten innerhalb des TGraphen MethodResolver Stellt Methoden bereit zum Aufl sen von Methoden und Konstruk toraufrufen innerhalb des TGraphen ResolverUtilities Beinhaltet statische Hilfsmethoden zur Verwendung durch die Resolver Klassen 6 6 Package javaextractor schema In diesem Package sind Schnittstellen enthalten welche von den Knoten und Kantentypen der erzeugten TGraphen implementiert werden Alle Quelltexte in diesem Package wurden durch das JGraLab Werkzeugs TgSchema2Java aus dem Schema siehe Anhang B erzeugt Auf grund der Menge der Typen soll hier jedoch nur auf generelle Eigenschaften eingegangen werden Jede dieser Schnittstellen legt die Eigenschaften eines Knoten oder Kantentyps fest F r jeden gleichnamigen Knoten und Kantentyp aus dem Metamodell existiert eine Schnittstelle Statt Klassen werden Schnittstellen erzeugt da im Metamodell
152. nz 7gralab x yava javac jgralab src de uni koblenz jgralab utilities tsschema2java x java 5 Nun k nnen die Graph Knoten und Kantenklassen d e der Javaextraktor ben tigt erzeugt werden TGSchema2Java generiert die entsprechenden Quelltexte aus den Informationen der Schemadatei java5 tg im Verzeichnis localrepository javaextractor src und schreibt diese in localrepository javaextractor src javaextractor schema Der Auf ruf geschieht mit folgendem Kommando yava de uni koblenz jgralab utilities tgschema2java TgSchema2Java f java5 tg p 6 Nachdem nun alle ben tigten Komponenten erzeugt und Quelltexte kompiliert wurden wird das eigentliche Extraktorprogramm kompiliert javac javaextractor x java JC localrepository ELCH common ELE javaextractor E javaextractor ELCH jaralab EME src EHE de AC uni koblenz EE jaralab Abbildung 7 Verzeichnisstruktur vereinfacht im verwendeten lokalen Repository Nach erfolgreicher Erzeugung kann der Javaextraktor verwendet werden Dies wird im n chs ten Kapitel beschrieben 43 6 Verwendung des Javaextraktors 8 2 Aufruf Um den Javaextraktor zu verwenden m ssen die gleichen Verzeichnisse und Dateien im CLASSPATH enthalten sein wie im vorherigen Kapitel beschrieben Der Aufruf des Java extraktors geschieht durch java javaextractor JavaExtractor Zus tzlich interpretiert das Programm folgende durch Leerzeichen getrennte Kommandozei lenparameter PFAD
153. o Synchronized 1 1 VertexClass Assert Statement EdgeClass IsConditionOfAssert IsConditionOf from Expression 1 1 to Assert 1 1 EdgeClass IsMessageOf AttributedEdge from Expression 1 to Assert 1 1 EdgeClass IsAnnotationOfVariable IsAnnotationOf from Annotation x to VariableDeclaration 1 1 EdgeClass IsModifierOfVariable IsModifierOf from Modifier 0 to VariableDeclaration 1 1 EdgeClass IsTypeOfVariable IsTypeOf from TypeSpecification 1 1 to VariableDeclaration 1 1 EdgeClass IsVariableNameOf AttributedEdge from Identifier 1 to VariableDeclaration 1 1 EdgeClass IslnitializerOfVariable AttributedEdge from Expression 1 to VariableDeclaration 1 1 Listing 1 Das im Javaextraktor eingesetzte Schema o4 C Dokumentation der Onlinerecherche C 1 Vorgehen C 1 1 Grober Ablauf der Tests Gr tenteils fanden wir f r unsere Zwecke im Internet Parsergeneratoren plus Grammatiken und Werkzeuge die eben diese benutzen Im Groben haben wir die Tools wie folgt behan delt Zun chst haben wir versucht die Software einzurichten Dies reichte von einer vollautomati schen Installation mittels Setup ber einen einfachen Kommandozeilenaufruf bis zur manu ellen Kompilierung der Quelltexte Dabei haben wir festgehalten ob dies wie vom Hersteller angegeben funktionierte oder wir einen eigenen Weg finden mussten Ein Produkt welches sich be
154. o erstellt ANTLR automatisch ein Token f r den String welches mit LITERAL beginnt Bsp enum in der Parsergrammatik wird dem To ken LITERAL enum zugeordnet Im Gegensatz zur Lexergrammatik k nnen Regeln der Parsergrammatik benutzerdefinierte Exceptions ausl sen Ferner kann der Parser dazu veranlasst werden einen AST aufzubauen Erzeugung des AST Um den Parser anzuweisen einen AST aufzubauen muss im Op tionsteil seiner Grammatik die Einstellung buildAST true gesetzt werden Grunds tzlich werden Regelnamen linke Seite zu Vaterknoten der Terminale Token und Regelreferenzen der rechten Seite Dabei wird die Reihenfolge von links nach rechts bernommen Ferner kann auch eine Tokenreferenz auf der rechten Seite der Regel zu einem Vaterknoten bef rdert werden Durch Erg nzung dieser mit einem Accent Circonflexe wird der Parser angewiesen alle Elemente zur rechten der Tokenreferenz als Kindknoten anzuh ngen Als Vaterknoten des Vaterknotens fungiert der aus dem Regelnamen resultierende AST Knoten Ein Ausrufezeichen hingegen weist den Parser an keinen entsprechenden AST Knoten zu erzeugen und dieses Element somit auch nicht mit in den Baum aufzunehmen Listing 38 verdeutlicht dies anhand von Beispielregeln Der resultierende AST ist in Abbildung 35 dargestellt a b c awird Vaterknoten von b amp c b B b wird ein Blatt keine Kindknoten c d e f c bekommt Kindknoten d der Vaterknoten von e amp f wird
155. o3ea1 jO9ed L1uouir 3s 1035nu3suo5S JOJezi eniu juoisueuuiqs T T R T Von geg Metamodell Teil 11 12 Abbildung 18 58 Buys enje n juegsuoy urgs CH Bugs Gau n n PA n Bus Gau n 6uo1 anjeA 3ue1suo56uo1 C Suns Gem O Buugs ee Duc nIPA a 9 qnoq niPA a juejsuoJuo aq C Juejsuoyalgnog uoissa4dx3 Bus Gau a jqnoq anjen ao 3ue31suop3eoj4 ue joog an en n wuejsuoyuesjoog mn Abbildung 19 Metamodell Teil 12 12 59 A Metamodell der Graphklassen o IsDeclarationOfl nvokedMethod Q IsDeclarationOfAccessedField o Edg o IsSourceUsagel n Q AttributedEdge o IsPartOf o IsSubPackageOf Q IsTypeDefinitionOf IsSourceFor o IsPrimarySourceFor Q IsTranslationUnitl n Q IsPackageOf IsProgramNameof Abbildung 20 Kantentypenhierarchie Teil 1 13 60 4o pogdoors Ey JOSPISpueyzyb ys E JOapispueuyersi Ey 4 1 E JOssejj4odnss 6 Agumo4t Luonde x3s Ey uunjoo g Jebeq1u au n y bua o 3esyo O E JO pog4ojonisuojs Ey souonupuoos Ey oquauntys Jouogejouuys Ey Abbildung 21 Kantentypenhierarchie Teil 2 13 61 A Metamodell der Graphklassen 4 15 1 5
156. on CoCoLab http www cocolab org Abruf 01 2008 28 Homepage von JAbstract http www doc gold ac uk mas0lsd jabstract Abruf 01 2008 29 Homepage von JReFactory http jrefactory sourceforge net Abruf 01 2008 184 Literatur 30 Homepage von FUJABA http www fujaba de Abruf 01 2008 31 JTB Java Tree Builder http compilers cs ucla edu 3tb Abruf 01 2008 32 Homepage von GCJ GNU Compiler for Java http gcc gnu org java Abruf 01 2008 33 Homepage von Java Espresso http www church project org Espresso JavaEspresso html Abruf 01 2008 34 Homepage von Eclipse http www eclipse org Abruf 01 2008 35 JDT Java Developer Tools for Eclipse http www eclipse org jdt core index php Abruf 01 2008 185
157. onen mit Kantennamen ist empfehlenswert da das Metamodell dadurch noch weiter vereinfacht werden kann Einige Knotentypen werden dadurch unn tig Zum Beispiel stammen Klassen wie ImplementsClause von Regeln der Grammatik ab die zur Wiederverwendung in anderen Regeln geschrieben wurden Klassen 161 F Entwicklung eines neuen Metamodells und Enums k nnen Interfaces implementieren In der Grammatik wird somit an zwei Stellen die Regel ImplementsClause referenziert In der Regel selbst wird jedoch nur eine weite re Regel referenziert Diese Referenz kann durch eine einfache Assoziation mit Kantennamen IsInterfaceOf ausgedr ckt und der Knotentyp Implement sClause somit berfl ssig werden Die Abbildungen 50 und 51 verdeutlichen dies Zus tzlich wurden in das Metamodell die Klassen integriert welche das Navigieren der TGra phen mit Gupro erm glichen Program TranslationUnit usw Das Metamodell bestand nun aus 89 Klassen 134 einfachen Assoziationen mit Namen und 63 Generalisierungen 3 ClassDefinition 1 1 implementsclause ImplementsClause 1 rtypespecification 9 TypeSpecification Abbildung 50 Modell der ClassDefinition mit Rollennamen aus dem Entwurf lal 3 ClassDefinition name String isl nterfaceOf Als TypeSpecification Abbildung 51 Modell der ClassDefinition mit Kantenname nach Uberarbeitung V5 Im n chsten Schritt wurden die letzen Klassen berarbeitet Zus tzlich wurden noc
158. onkrete Deklaration an einer anderen Stelle im Quelltext Es besteht somit eine semantische Beziehung zwischen Benutzung und Deklaration des selben Elements Nicht gemeint ist die in objektorientierten Programmiersprachen bliche Objektreferenz die zum Beispiel beim Ubergeben von Argumenten verwendet wird 2 Anforderungsliste Javaextraktor Zu Beginn der Studienarbeit wurden die Anforderungen an den Javaextraktor aufgestellt Zum Teil stammen diese unmittelbar aus der Aufgabenstellung teilweise ergeben sie sich indirekt aus dem Kontext der Verwendung des Javaextraktors und manche sind eine Festlegung einer allgemein bekannten geeigneten Vorgehensweise Die Anforderungen an den Javaextraktor wurden mit Priorit ten versehen Dabei entsprechen die verwendeten Farben den Priorit ten f r die Umsetzung der jeweiligen Anforderung e MUSS Die Anforderung muss auf jeden Fall umgesetzt werden e SOLLTE Die Anforderung sollte umgesetzt werden wenn es m glich ist e OPTIONAL Die Anforderung ist optional Ferner ist nach jeder Anforderung eine kurzer Vermerk ber den Status ihrer Umsetzung auf gef hrt 2 1 Funktionale Anforderungen Die funktionalen Anforderungen legen fest was der Javaextraktor leisten soll 1 MUSS Der Faktenextraktor soll Java Quelltexte nach M glichkeit bis einschlie lich Version 5 zu einem TGraphen umsetzen k nnen Erf llt 2 OPTIONAL Die Schemata sollen neben einer feink rnigen Graphenrepr sent
159. peParameter AttributedEdge from TypeSpecification x to TypeParameterDeclaration 1 1 178 v l EdgeClass IsAnnotationOf Type IsAnnotationOf from Annotation to Type 1 1 180 s VertexClass ClassDefinition Type 182 EdgeClass IsModifierOfClass IsModifierOf from Modifier x to ClassDefinition 1 1 is EdgeClass IsClassNameOf AttributedEdge from Identifier 1 1 to ClassDefinition 1 1 184 EdgeClass IsTypeParameterOfClass sTypeParameterOf from TypeParameterDeclaration 0 x to ClassDefinition 1 1 71 18 18 ON 187 188 190 LA N 20 N 20 LA 204 20 ON 207 20 oo 209 210 211 21 N 21 LA Schema der Graphklassen EdgeClass IsSuperClassOfClass IsSuperClassOf from TypeSpecification 1 to ClassDefinition 1 1 EdgeClass isinterfaceOfClass IsInterfaceOf from TypeSpecification to ClassDefinition 1 1 EdgeClass IsClassBlockOf IsBlockOf from Block 1 1 to ClassDefinition 1 1 VertexClass InterfaceDefinition Type EdgeClass IsModifierOfInterface IsModifierOf from Modifier x to InterfaceDefinition T 1 55 EdgeClass IsInterfaceNameOt AttributedEdge from Identifier 1 1 to InterfaceDefinition 1 1 EdgeClass IsTypeParameterOflnterface IsSTypeParameterOf from TypeParameterDeclaration
160. r JavaExtractor out testgraph tg name Testprogramm log testextract log eager testit testl java testit test2 java testit2 9 Abschlie ende Betrachtung Dieses Kapitel widment sich einer abschlie enden Betrachtung der Entwicklung des Javaex traktors Zun chst werden die umgesetzten Anforderungen bewertet und abschlie end m gli che Weiterentwicklungen aufgezeigt 9 1 Umgesetzte Anforderungen Die meisten Anforderungen konnten umgesetzt werden Von den MUSS Anforderungen konn ten alle umgesetzt werden Nur eine Anforderung Nr 6 der SOLLTE Anforderungen konnte nicht realisiert werden da die Javagrammatik von Michael Studman nur syntaktisch korrekten Code zulie Die Erf l lung der Anfoderung w re zu aufwendig gewesen da eine neue Grammatik h tte entwickelt werden m ssen Zwei optionale Anforderungen Nr 4 und 12 wurden nicht umgesetzt Eine Besch ftigung mit der Anfragesprache f r TGraphen GReQL 12 und das Vornehmen von Unit Tests konnten nicht mehr im zeitlichen Rahmen der Studienarbeit stattfinden 9 2 Ausblick Im Rahmen dieser Studienarbeit wurde ein Faktenextraktor f r Java Quelltexte entwickelt Der Javaextraktor generiert eine TGraph Repr sentation der Quelltexte eines in Java imple mentierten Softwareprojekts Dieser TGraph ist dann durch die Werkzeuge des Gupro Projekts weiter verarbeitbar Der Javaextraktor kann Javaquelltexte bis einschlieblich Javaversion 6 verarbeiten Dazu wur de
161. r comments Commen Ciass column int length int line int logger Logger offset int CammentClasaint int int int Logger void ere siz l GranhEleasrenmtsulawat ramslationm mit waig javaextractor comments SingleLineCommentClass javaextractor comments JavaDoc Comment Class create TGraphElementaJavas TranslatianUnit woid Jawaboclommentllassint int int int Logger void create GraphElementoldavaS Translationllnit void SingleLineCommentClassint int int int Logger void javaextractor comments Multi Line Comment Class createTGraphElementaJavas Translationllnit woid MultiLineCommentllassint int int int Logger waid Abbildung 4 Klassendiagramm des Package javaextractor comments 6 4 Package javaextractor factories Dieses Package enth lt Klassen die Funktionalit t zum Erstellen von Teilstrukturen im TGraph aus Elementen des ASTs implementieren Diese Klassen werden in JavaTreeParser ver wendet so dass der Treewalker selbst kompakt bleibt und dort mehrfach ben tigte Funktionen nur einmal implementiert werden m ssen Die Implementierung der Klassen ist an die Pat terns Abstract Factory siehe 7 auf den Seiten 87ff und Factory Method siehe 7 auf den Seiten 1071 angelehnt SubgraphFactory Diese abstrakte Klasse stellt die in allen weiteren Factory Klassen be n tigte Funktionalit t zum Halten einer Referenz auf den TGraph und die Symboltabelle bereit Alle K
162. r einen Knoten PLUS der zwei Kinderknoten expr besitzt Dabei muss der Vaterknoten immer ber eine Tokenreferenz identifiziert werden d h dem muss urspr nglich ein Token zugrundeliegen Auch hier erfolgt die Auswertung in semantischen Aktionen Es f llt sofort auf dass hier nur eine Regel zur Auswertung n tig ist und eine Betrachtung der Pr zedenzen entf llt da diese durch die Struktur des Baumes abgebildet werden Die Erzeugung des Treeparsers geschieht analog zur Erzeugung des Lexers und Parsers ANTLR erzeugt die Klassen ExprTreeParser javaundExprTreeParserTokenTypes java Benutzt werden kann der Treeparser in o a Main Klasse allerdings muss diese mit den Zeilen aus Listing 47 erg nzt werden davor muss der Parser die Eingabe verarbeitet haben AST t parser getAS1 System out println t toStringTree ExprTreeParser treeParser new ExprTreeParser int x treeParser expr t System out println x Listing 47 Anvvenden des Treeparsers auf den AST Auch hier f hrt die Eingabe von 3 4x5 zum Ergebnis von 23 154 F Entwicklung eines neuen Metamodells F 1 Vorgehensweise Als Grundlage des Metamodells dient die Java 5 Grammatik f r ANTLR v2 7 6 Zun chst wurden aus der Vorlage von Bodo Hinterw ller allgemeine Vorgehensweisen um ein Meta modell aus einer Grammatik zu gewinnen hergeleitet Im n chsten Schritt wurde ein Entwurf des Metamodells erstellt der sich jedoch zu stark an der Urspru
163. rd der Wert der Variable i durch die vier semantischen Aktionen am Ende der Regel entweder 1 oder 1 betragen type int i 0 1 classOrInterfaceType i builtInType i S Listing 30 Regel mit semantischen Aktionen Sollte in der semantischen Aktion auf ein Symbol der Regel zugegriffen werden so sind dazu spezielle Operatoren n tig Dadurch wird die semantische Aktion nicht mehr unver ndert in den Zielquelltext kopiert sondern erf hrt zuvor einige Ersetzungen Dazu siehe aber weiter unten Semantische Pr dikate Ein Pr dikat beschreibt eine Bedingung die zur Laufzeit er f llt sein muss damit der Parsingvorgang fortgesetzt werden kann Diese Bedingung muss dann t rue oder false sein Im semantischen Pr dikat wird die Bedingung in der Zielspra che formuliert Diese steht in den Grammatiken zwischen geschweiften Klammern mit einem angeh ngten Fragezeichen 7 Dabei sollte die Bedingung immer nach der Seman tik eines Symbols fragen wie beispielsweise in Listing 31 Dort wird nach Abarbeitung der Regel berpr ft ob der Text des Tokens ID ein Typname ist decl var ID t ID isTypeName t getText Listing 31 Regel mit validierenden semantischen Pr dikat Bei o a Beispiel handelt es sich um ein validierendes semantisches Pr dikat Es muss einer Produktion immer nachgestellt werden und wie Assertions eine Exception ausl sen sollte die Bedingung nicht erf llt sein In diesem Beispie
164. rdefinitionen e Methodenaufrufe dies beinhaltet auch Konstruktoraufrufe Das Aufl sen aller Quelltextreferenzen geschieht dann in zwei Schritten Im ersten Schritt wird nach dem Parsen jeder Datei versucht Referenzen lokal aufzul sen die in dieser Datei gefunden wurden d h sie werden mit Definitionen abgeglichen die nur lokal in dieser Datei sichtbar sind z B Definitionen von lokalen Variablen inneren Klassen usw SDies ist nur bei Identifier der Fall 36 7 3 Autl sen der Quelltextreferenzen Quelltextreferenzen die auf diese Weise nicht aufgel st werden k nnen werden im zweiten Schritt erneut behandelt Nach dem Parsen aller Quelltexte sind alle o a Definitionen im Graph vertreten und in der Symboltabelle gespeichert Diesmal werden die Quelltextreferen zen mit global sichtbaren Definitionen abgeglichen Sollte das Aufl sen dabei ebenfalls nicht m glich sein wird abh ngig vom Modus des Extraktors auch eine Aufl sung per Introspek tion versucht Dabei k nnen nur Elemente gefunden werden die ber den CLASSPATH erreichbar sind 7 3 2 Anpassung des Graphen w hrend des Aufl sevorgangs Beim Aufl sen wird eine Quelltextreferenz ber eine Kante mit hrer Definition verbunden Konkret werden dazu folgende Kanten erzeugt 1sTypeDefinitionOf von Type zu TypeSpecification Knoten 1sInvokedMethod von MethodDeclaration MethodDefinition bzw ConstructorDefinition zuMethodInvocation Knoten e sD
165. re ebenfalls eine Implementierung der AST Erzeugung und die Erstellung eines bracuhbaren Lexers notwendig F r Coco R m sste eine Grammatik f r Java 1 5 erzeugt werden und ebenfalls die Funktiona lit t der AST Erzeugung implementiert werden Bei ANTLR wire es lediglich notwendig die Funktion zur Positionsabfrage zu modifizie ren Aufgrund der genannten F higkeiten und des gesch tzten Aufwands im Vergleich der einzel nen Tools ist ANTLR unser derzeitiger Favorit C 7 Javaquelltexte f r Tests zr Diese Klasse wurde von Eric Blake geschrieben und enthaelt einige Graenzfalle der Javaspezifikation bis Version 1 4 x Stammt urspruenglich aus Testquelltexten fuer die Java 1 5 x Grammatik von CUP Some valid java code from Eric Blake Some of these k constructions broke previous versions of the grammars x These should all compile with any JLS2 javac as well as ul x parse correctly no syntax errors using the 2 x Javal2 cup java14 cup java15 cup grammars in this package x 13 class Eric 14 parenthesized variables on the hand size of al assignments are legal according to JLS 2 See comments oo nN A o N 112 C 7 Javaquelltexte f r Tests 16 on ilkes bug 105 www 124 ibm com developerworks bugs func detailbug amp bug is Ai Id2105 amp group id 10 19 Ai for more details According to Eric Blake 201 The 2nd edition JLS is weak on this point the grammar
166. rhaupt nicht einrichten lie haben wir nicht angetroffen Anschlie end haben wir versucht aus einer einfachen Beispielgrammat k einen Parser zu er zeugen und diesen zu testen Auch hier hielten wir fest ob dies wie dokumentert funktionierte oder ob wir einen eigenen Weg finden mussten Teilweise stellten wir fest dass die Erzeugung zwar noch dokumentiert war die Verwendung der erzeugten Parser hingegen nicht mehr und nicht immer fanden wir eine L sung Im letzten Schritt haben wir versucht aus den Javagrammatiken die Parser zu erzeugen und diese zu testen Auch hier haben wir unser Vorgehen und die Ergebnisse dokumentiert Leider mussten wir auch hier feststellen dass die Erzeugung noch ausreichend dokumentiert war die Verwendung der Parser aber nicht Fanden wir keinen eigenen Weg diese zu benutzen entfielen die Parsingtests auf die wir im folgenden Abschnitt genauer eingehen C 1 2 Parsingtests Sinn der Parsingtests war es zu erfahren ob die Parser e die neuen Java 5 Ausdr cke verarbeiten k nnen e auch komplizierte Javaausdr cke akzeptieren e untypische Fehler bemerken e mit problematischen Newlines klarkommen 85 C Dokumentation der Onlinerecherche Dazu haben wir die Tests in drei Phasen unterteilt In der ersten Phase wurden nur Quelltexte bersicht siehe Tabelle 4 geparst die vom Java Compiler javac fehlerfrei bersetzt werden k nnen Dazu mussten die Parser zun chst eine Klasse verarbeiten die laut
167. rsergeneratoren benutzen Tesiquelltext OK TestJSR201 Berichtigt Nein Erkennt offensichtlich das Keyword enum nicht ForEachInShouldGiveParseError Ja Ervvartet korrekterweise anstelle von AbstractEnumShouldGiveParseError Nein Erkennt nicht den eigentlichen Fehler son sasa dern erkennt das enum nicht AbstractFinalShouldGiveParseError Nein Beide widerspr chlichen Modifier werden ohne Fehlermeldung n den AST aufgenom men ohne Fehlermeldung in den AST aufgenom men PublicPrivateShouldGiveParseError Beide widerspr chlichen Modifier werden Tabelle 15 Ergebnisse Parsingtests ANTLR Parser nach Stahl Grammatik 101 C Dokumentation der Onlinerecherche Testquelltext EscapeSequences ForEachInShouldGiveParseError Ja Erwartet korrekterweise anstelle von AbstractEnumShouldGiveParseError Nein Der ung ltige Modifier wird ohne Fehler TTT eng inden AST aufgommen II AbstractFinalShouldGiveParseError Nein Beide widerspr chlichen Modifier werden ohne Fehlermeldung in den AST aufgenom men PublicPrivateShouldGiveParseError Nein Beide widerspr chlichen Modifier werden ii ohne Fehlermeldung in den AST aufgenom men Tabelle 16 Ergebnisse Parsingtests ANTLR Parser nach Studman Grammatik Rechercheergebnis Aktualit t neue Version in Entwicklung Benutzer tragen immer wieder Gram BEEN NNNM Dokumentation Einf hrung Pr sentationen Tutorials FAQ Handbuch Ar
168. s Javaextraktors fest 9 10 11 1 13 14 MUSS Der Faktenextraktor soll effizient arbeiten Konkret bedeutet dies dass der Extraktor eine in Abh ngigkeit von der Menge des zu analysierenden Quelltextes vertretbare Laufzeit aufweisen soll Erf llt OPTIONAL Der Faktenextraktor soll in Java realisiert werden Erf llt MUSS Der Programmierstil aus der Vorlesung Programmierung soll angewendet werden Erf llt OPTIONAL Der Quelltext soll mit Unit Testing berpr ft werden Nicht erf llt MUSS Der Quelltext soll Javadoc kompatibel kommentiert werden Erf llt MUSS Die Architektur soll in UML visualisiert werden Erf llt Ferner sollte nach bestehenden Tools recherchiert werden welche f r den Javaextraktor ver wendet werden k nnen Folgende Anforderungen ergaben sich dadurch 2 2 Nichtfunktionale Anforderungen 15 SOLLTE Bestehende Werkzeuge sollten den eigenen Entwicklungsaufwand soweit wie m glich reduzieren Erf llt Es war keine Entwicklung eines eigenen Lexers und Parsers n tig da diese automatisch aus einer bereits existierrenden Grammatik erzeugt werden konnten 16 SOLLTE Bestehende Werkzeuge sollten sich m glichst noch in der aktiven Weiterent wicklung befinden so dass evtl bestehende Fehler korrigiert werden und eine Weiter entwicklung etwa f r neue Java Versionen absehbar ist Erf llt Bei ANTLR ist dies der Fall 17 MUSS Bestehende Werkzeuge
169. s Parser expr mexpr PLUSIMINUS mexpr mexpr atom STAR atom x atom INT LPAREN expr RPAREN Listing 41 Parsergrammatik f r Taschenrechner aus calculator g Mit Lexer und Parsergrammatik ist es bereits m glich arithmetische Ausdr cke zu akzeptie ren In diesem Sinne wird im n chsten Abschnitt die Erzeugung und Benutzung von Lexer und Parser besprochen Auf die Auswertung der Ausdr cke wird anschlieDend eingegangen E 2 3 Erzeugung amp Benutzung Soll der Parser erzeugt werden muss ANTLR mit den Dateinamen der Grammatiken als Pa rameter aufgerufen werden Da beide Grammatiken zusammen in einer Datei stehen k nnen wird diese in eine Datei calculator g gespeichert Um Lexer und Parser zu erzeugen reicht ein Aufruf von Java antlr bool calculator Zuvor muss jedoch die Datei ant1r jar in die CLASSPATH Umgebungsvariable aufge nommen werden ANTLR erstellt dann die Dateien ExprLexer java enth lt den Lexer ExprParser java enth lt den Parser und ExprParserTokenTypes java enth lt die gemeinsamen Tokens von Lexer und Parser Wie man sieht werden die Dateien und die teils darin enthaltenen Klassen wie in den Gram matiken benannt Um nun den Parser benutzen zu k nnen wird eine weitere Klasse ben tigt welche die M glichkeit bereitstellt arithmetische Ausdr cke einzugeben Diese m ssen dem Lexer bei dessen Instanziierung als Konstruktorparameter bergeben werden ebenso wie dem Parserkonstruktor
170. s Programm zug nglich sondern werden durch das Paket JDT User Interface 1n die graphische Oberfl che von Eclipse integriert Ebenso ist es m glich die Funktionalit t ber die Plugin Schnittstellen in eigenen Eclipse Plugins zu verwenden 110 C 6 Fazit Rechercheergebnis letztes Update Release Version 03 10 2005 Handbuch API Spezifikation Newsgroups FAQ Forum etc ber E Mail Newsgroups Forum IRC frei verf gbar Tabelle 23 bersicht JDTCore Eclipse C 6 Fazit Nach der vorangegangenen bersicht k nnen nun einige Tools aus der engeren Auswahl aus geschlossen werden JAbstract bietet zwar die M glichkeit zur Erzeugung eines AST entf llt aber aufgrund der v llig veralteten Grammatik und der mangelnden Weiterentwicklung JRefactory unterst tzt zwar Parsing von Java 1 5 1st aber aufgrund der mangelhaften Do kumentation des Parsers welche schon die Parsing Tests vereitelte und der Inaktivit t der Entwickler seit fast zwei Jahren als stabile Grundlage ebenfalls ausgeschlossen Fujaba wird aktiv weiterentwickelt liefert aber einen AST der bei weitem nicht vollst ndig ist Desweiteren wird derzeit lediglich Java bis Version 1 4 unterst tzt so dass dieses Tool technisch ungeeignet ist GCJ entf llt aufgrund der Tatsache dass sowohl der Parsergenerator als auch der erzeugte Parser in C vorliegen Eclipse bzw das JDT Core Paket besitzen zwar weitgehend alle ben tigten Funktionen im
171. s der Parser angewiesen werden die neuen AST Elemente zu erzeugen Zus tzlich zu o a Anweisungen aus Listing 4 3 1 reicht dazu die Angabe von javaParser setAS TNodeClass javaextractor adapters CommonAS TAdapter Abbildung 2 veranschaulicht die Anpassung in einem Klassendiagramm Erh ht den Offset nur um 1 wenn ein Tabulator im Eigabestrom erkannt wird 16 4 3 N tige Anpassungen antir CommonAst antlr CommontToken CommonTokenAdapter me endCol int endLine int CammanASTAdapter CommonAs TAdapte ny LommeonASTAdapten Token offset int getColumn int getLined int CommonTokenAdapteni getOfiset int CommonTokenAdapten String getT exti String banane LommonTokenAdaptenrint String getToken Token ck z getEndCalumn int getEndLined int getFileHamer String getOtiset int zetEndCalumn nt void setEndLinerint void szetFileHame String void setF omCommaonASTAdapten Common ASTAdapter woid set ffsetint woid getTyperi int 1 initialize Token woid initialize String int void initialize AS T woid setT ext String void setToken Token woid setTypecinty void Abbildung 2 Klassendiagramm Auszug aus Package javaextractor adapters 4 3 3 Anpassungen zum Aufnehmen der Kommentare in den TGraph Mit der urspr nglichen Grammatik wurden w hrend des Parsens alle
172. sergeneratoren genauer untersucht C 2 1 JavaCC Eine kurze bersicht zu den wichtigsten Daten von JavaCC findet sich in Tabelle 8 Historie Der Java Compiler Compiler wurde 1996 von Sreeni Viswanadha und Sriram Sankar f r die Sun Microsystems Laboratories entwickelt Seitdem ist das Werkzeug von den beiden stetig weiterentwickelt worden Seit Juni 2003 steht der Quelltext unter der FreeBSD Lizenz frei zur Verf gung und die aktu elle JavaCC Version wurde im Januar 2006 ver ffentlicht 87 C Dokumentation der Onlinerecherche Charakterisierung JavaCC ist ein in Java implementierter Parsergenerator der LL k Parser und die zugeh rigen Lexer in Java erzeugt Eine Vielzahl von Grammatiken f r ver schiedene Programmiersprachen ist auf 22 und 23 verf gbar auch f r Java bis Version 5 Die Erzeugung von B umen geschieht nicht automatisch sondern muss von Hand in die Grammatiken eingebaut werden Alternativ kann dies auch durch den Einsatz von Werkzeu gen wie dem mitgelieferten JJTree oder JTB erreicht werden die auf der Basis von Gram matiken f r JavaCC B ume erzeugen k nnen Literatur Zu JavaCC wird eine ausf hrliche Dokumentation mitgeliefert Diese umfasst neben einem Benutzerhandbuch diversen Tutorials einer FAQ einer kurzen Schnittstellen beschreibung der erzeugten Lexer und Parser auch eine Dokumentation zu JJTree Weitere Unterst tzung f r den Benutzer bietet ein Forum und eine Mailingliste Ferner gibt
173. sie keinen syntaktischen Ursprung haben Sie werden dazu verwendet die Graphrepr sentation der Definition eines Elements mit der Gra phrepr sentation der Benutzung dieses Elements zu verbinden Z B verbindet die Kante vom Typ IsTypeDefinitionOf eine ClassDefinition mit einem QualifiedType der eine Typspezifikation repr sentiert Das Metamodell besteht in seiner finalen Fassung aus 89 Knoten und 160 Kantentypen 27Diese wurden als abstrakt deklariert 163 F Entwicklung eines neuen Metamodells a TypeParameterDeclaration isLowerBoundOf isTypeParameterNameOf aul ae 0 1 0 1 1 Fl 33 Identifier 2119 TypeSpecification name String Abbildung 52 Modell der TypeParameterDeclaration F 1 5 Verifikation des Metamodells Wie bereits oben beschrieben war eine immerw hrende berpr fung der Ergebnisse n tig Anfangs waren es komplizierte Strukturen im Modell die es zu berpr fen galt Diese waren meist korrekt da sie sich noch sehr stark an die Grammatik anlehnten Im Zuge der Vereinfa chung des Modells galt es zu berpr fen ob die einfachen Strukturen mindestens die selben syntaktischen Konstruktionen aus Java abbildeten wie ihre komplizierten Pendants Deshalb haben wir zu jedem Subgraphen im Metamodell Stellvertreter erlaubter syntakti schen Konstruktionen aus Java aufgeschrieben und gepr ft ob diese abgedeckt werden Um diese berpr fung einfacher vornehmen zu k nnen haben wir die Elemente im Klassendia
174. spiel ai z anzu geben statt alle Zeichen des Alphabets einzeln aufzuf hren 138 EI Grundlagen au n EBNF in ANTLR 0 bis x Option 0 oder bis Element Set Komplement Bereichsoperator von bis NENNEN Wildcard AST Wurzeloperator AST Ausschlussoperator Semantisches Pridikat Syntaktisches Pr dikat Tabelle 25 Operatoren der ANTLR Metasprache Der Wildcard Operator stammt von den regul ren Ausdr cken und matcht jedes Zei chen Die AST Operatoren dienen zum Steuern der Erzeugung eines AST und werden in Abschnitt E 1 5 detailiert erl utert Die Pr dikate werden in bereits in Paragraphen dieses Abschnitts n her behandelt Aufbau einer Regel Die Regeln der Grammatik bestehen aus einer linken und rechten Seite Die Seiten werden durch einen Doppelpunkt getrennt im Gegensatz zu in EBNT Die Regel endet dann immer mit einem Semikolon Auf der linken Seite steht der Regelname optional k nnen neben der Sichtbarkeit der Re gel auch Eingabe und Ausgabeparameter sowie eine semantische Aktionen welche vor der Regel ausgef hrt wird festgelegt werden Auf der rechten Seite stehen die Produktionen wel che mit Optionen semantischen und syntaktischen Pr dikaten sowie weiteren semantischen Aktionen erweitert werden k nnen Ein Beispiel f r eine einfache Regel zeigt Listing 25 type classOrInterfaceType builtInType Listing 25 Regel im Parser die
175. st genau das Sprachkonstrukt welches er repr sentiert Z B repr sentiert der Knotentyp If die If Anweisung Die syntaktische Reihenfolge kann im Metamodell nicht explizit festgelegt werden deshalb ist die Reihenfolge im Klassendiagramm graphisch abgebildet So kann ein Entwickler die vom Programmieren bekannten Strukturen einfach wiedererkennen F r die richtige Reihenfolge der Elemente im Graphen sorgt der Faktenextraktor Er stellt si cher dass die syntaktische Reihenfolge bei der Erstellung des Graphen miteinfliesst da die einzelnen Elemente durchnummeriert werden Ebenso werden mehrere gleichartige Graph elemente z B mehrere Parameter einer Methodendeklaration in ihrer Ordnung der syntakti schen Reihenfolge entsprechend Das Metamodell besteht aus 89 Knoten und 160 Kantentypen Diese hier alle zu beschrei ben w rde den Rahmen sprengen Deshalb wird in den n chsten Abschnitt nur ein berblick gew hrt Die Entwicklung des Metamodells ist 1n Anhang F detailliert beschrieben 5 4 1 Grundlegende Knoten und Kantentypen im Metamodell Damit ein TGraph mit durch die Guprowerkzeugen weiterverarbeitet werden kann muss er bestimmte Knoten und Kanten enthalten Das Metamodell legt die Typen dieser Knoten und Kanten fest welche im folgenden beschrieben werden e Program ist der oberste Knotentyp des Metamodells In einem TGraph existiert je weils nur ein Knoten dieses Typs er repr sentiert das geparste Softwareprojekt
176. statement 324 325 326 explicitConstructorInvocation 327 Ta typeArguments 328 this 7 arsList x 329 super argList 330 331 332 variableDefinitions 334 variableDeclarator variableDeclarator 3 LA 335 336 3 variableDeclarator 338 IDENT declaratorBrackets varlnitializer LA 339 340 31 declaratorBrackets 342 343 344 varlnitializer 346 7 initializer 347 348 39 arrayInitializer 350 351 initializer 352 initializer 353 x 354 355 uu 356 357 358 Initializer Nn 174 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 ctorHead throwsClause 2 Javagrammat k aus ANTLR expression arrayInitializer IDENT parameterDeclarationList throwsClause throws identifier identifier parameterDeclarationList parameterDeclaration parameterDeclaration variableLengthParameterDeclaration variableLengthParameterDeclaration parameterDeclaration parameterModifier typeSpec IDENT declaratorBrackets variableLengthParameterDeclaration parameterModifier typeSpec IDENT declaratorBrackets
177. sts der Quelltexte mit problematischen Newlines verliefen hingegen positiv Eine bersicht zu den Testergebnissen findet sich in Tabelle 13 Testquelltext AllowedGenericConstruct Alles erkannt ForEachInShouldGiveParseError Ja 23 13 Error found expected Identifier cd I 25 17 Error found expected Identifier PublicPrivateShouldGiveParseError Nein TestsPositionsLinux Alles erkannt TestsPositionsMac Alles erkannt TestsPositionsWindows Alles erkannt TestZeilenumbrueche ASCII Alles erkannt Tabelle 13 Ergebnisse Parsingtests Cocktail 91 C Dokumentation der Onlinerecherche Rechercheergebnis letztes Update im August 2005 Einf hrung Tutorials FAQ Handb cher Artikel Linux Win32 kosienpflich g nicht verf gbar Tabelle 14 bersicht Cocktail Java bis 5 C C C uva C 2 5 ANTLR Eine kurze bersicht zu den wichtigsten Daten von ANTLR findet sich in Tabelle 17 Historie Die Entwicklung des ANother Tool for Language Recognition begann 1988 urspr nglich als Projekt an der Purdue Universit t West Lafayette Indiana USA damals noch unter dem Namen YUCC bzw PCCTS Dieses Projekt wurde 1989 Inhalt der Mas terarbeit von Terence Parr welcher fortan die Schl sselfigur hinter ANTLR wurde Die erste ffentlich verf gbare Version erschien 1990 und ist seit jeher quelloffen verf gbar Das Projekt wurde kontinuierlich weiterentwickelt und Terence Parr besch ftigt sic
178. sweise des Javaextraktors An den gemessenen Werten ist zu erkennen dass der Aufwand generell linear mit der Zahl der Codezeilen ansteigt Erwartungsgem ist die Zeitaufwand im Modus COMPLETE am gr ten und im Modus LAZY am niedrigsten Teilweise ist der Zeitaufwand jedoch in EAGER am gr b ten da in diesem Modus ein und dieselbe Klasse ggf mehrfach per Introspektion untersucht werden muss Im Modus EAGER 1st jede externe Klassendefinition nach dem Aufl sen der Typspezifikationen per Reflexion jeweils nur mit einem Knoten im TGraph vertreten F r die Aufl sung der Methodenaufrufe werden mehr Informationen ben tigt so dass die betroffene Klasse nochmals per Reflexion untersucht wird Kann eine Quelltextreferenz aufgel st werden wird im Graph ein Knoten gel scht und daf r eine Kante erzeugt So 1st im Modus LAZY die Anzahl der Knoten h her und die Anzahl der Kanten niedriger als in den Modi EAGER und COMPLETE da weniger Quelltextreferenzen aufgel st werden k nnen 40 7 4 Aufwandsbetrachtung Ipourop er x4 ueuoporgos1oA ur UISUNSSIJA Jap ISSTUQO IH c o 9qe 616 80011 6OCOLC r OCG 6L oer B v8 reet 929 vurogosz0penxoeAef 699186 786 996 YE TSS op 9 VCTI8 LrG CEC 929 advo 166 116 SIL S89 89 612 LO S LZ 6L Lr zez 979 Azer 1 ewoyossorenxoeaef 86LCL8 TEL 68b IS SCF 98 8 8
179. t der Parser keinen guten Eindruck Den simplen Fehler dass mehr als ein Sichtbarkeits Modifier bei einer Deklaration benutzt werden erkennt der Parser nicht Genauso kommentarlos verarbeitet der Parser die Modifier abstract und final in einer Deklaration Wenigstens meldet der Parser einen Fehler bei einem falschen ForEachIn Konstrukt Das Parsen der Quelltexte mit problematischen Newlines absolviert der Parser hingegen ta dellos Eine bersicht zu den Testergebnissen findet sich in Tabelle 7 C 2 2 CUP Eine kurze bersicht zu den wichtigsten Daten von CUP findet sich in Tabelle 10 89 C Dokumentation der Onlinerecherche Tesiquelitext AllowedGenericConstruct Alles erkannt AllowedForEachConstructs Parse error at line 12 column 23 Encounte red AnotherAllowedForEachConstruct Alles erkannt Alles erkannt EscapeSequences Alles erkannt Test15 Nein Parse error at line 54 column 13 Encounte red lt TestJSR201 Berichtigt Parse error at line 22 column 23 Encounte red Tabelle 7 Ergebnisse Parsingtests JavaCC Rechercheergebnis Support Parsergenerator in Parser in Grammatiken f Unterst tzte OS Lizenz Quelliexie Tabelle 8 bersicht JavaCC 90 C 2 Parsergeneratoren Historie Der Java tm Based Constructor of Useful Parsers kurz CUP wurde urspr ng lich 1996 von Scott Hudson Frank Flannery und C Scott Ananian an der Princeton University und Georgia Tech siehe 24 entwickelt D
180. taAnnotationOf IsAnnotationOf from Annotation to AnnotationDefinition 1 1 is EdgeClass IsAnnotationBlockOf IsBlockOf from Block 1 1 to AnnotationDefinition 1 1 N N 216 17 VertexClass FieldAccess Expression is EdgeClass IsFieldContainerOf AttributedEdge from Expression 1 to FieldAccess 1 1 219 EdgeClass IsFieldNameOf AttributedEdge from Identifier 1 1 to FieldAccess 1 1 20 EdgeClass IsArrayElementlndexOf AttributedEdge from Expression to FieldAccess 1 1 21 EdgeClass IsDeclarationOfAccessedField from Vertex to FieldAccess 1 1 222 23 VertexClass Methodlnvocation Expression type MethodlnvocationTypes 24 EdgeClass IsMethodContainerOf AttributedEdge from Expression 1 to Methodlnvocation 1 1 2 EdgeClass IsNameOflnvokedMethod AttributedEdge from Identifier 1 1 to Methodlnvocation 1 1 21 EdgeClass IsArgumentOfMethodInvocation IsArgumentOf from Expression to Methodlnvocation 1 1 EdgeClass IsDeclarationOflnvokedMethod from Member x to Methodlnvocation 1 1 N N N N N 228 29 VertexClass ConditionalExpression Expression 20 EdgeClass IsConditionOfExpression IsConditionOf from Expression 1 1 to ConditionalExpression 1 1 s EdgeClass IsMatchOf AttributedEdge from Expression 1 1 to ConditionalExpression 1 135 32 EdgeClass IsMismatchOf Attribute
181. tation 3 x Of the grammar It should compile correctly using a al x 14 javac as well as parse correctly no syntax si x errors using the java15 cup grammar in this package e 7 public class Test15 lt X gt s lt I gt Test15 T t1 d inta 1 b 2 C c1 new C lt Integer gt 11 C2 new C B 2 new C B 3 C lt B gt cc2 cC2 4 C lt B gt cc3 c3 5 booleand a lt b e a lt b wi int new int 5 u boolean g a lt ff1 is booleanh a lt f 1 19 Object iO A cc3 22 Object i A lt B gt cc3 Object A lt B cc2 115 C Dokumentation der Onlinerecherche 50 116 Object k A lt A lt Bl gt gt null Object kk A lt A lt gt gt null Test15 lt X gt H hh null Test15 lt X gt H hhh null for boolean m a lt b a lt b ach f 0 a a for d b b A lt Integer gt m c1 if m instanceof C lt Integer gt a a for boolean n m instanceof C lt Integer gt O a b p cc3 instanceof C B cc3 instanceof C B n m instanceof C lt Integer gt O a b p cc3 instanceof C lt B gt b b for m instanceof C lt Integer gt a a if a lt b gt gt 1 Object o1 new A lt A lt B gt gt 02 new A lt A lt A lt B gt gt gt 03 new A lt A lt D lt B A lt B gt gt gt gt new explicit parameter version of method Invocation A lt Integer gt a
182. tax mit ei nem Top down Ansatz zu erkennen Der Parser kann zur Entscheidungsfindung beliebig viele Tokens weit vorausschauen dieser Wert wird als Lookahead bezeichnet Eine formale Defini tion und Beschreibung von LL Parsern findet sich in 1 auf den Seiten 174ff und 190 191 Treewalker Ein Treewalker ist ein Programm welches einen Baum traversiert Im Rah men der Studienarbeit werden aus Javaquelltexten abstrakte Syntaxb ume von einem Parser erzeugt und von einem Treewalker traversiert Auch ein Treewalker kann durch eine Grammatik beschrieben werden Aus dieser kann wie derum automatisiert ein Treewalker erzeugt werden Abstrakter Syntaxbaum AST Ein AST ist ein Baum der durch seine Struktur die Syntax eines Textes abbildet Im Rahmen der Studienarbeit sind dies Javaquelltexte Abstrakter Syntaxgraph ASG Im Gegensatz zu einem abstrakten Syntaxbaum darf ein ASG zyklisch sein und identische Elemente durch einen einzelnen Knoten oder Blatt re pr sentieren 1 Einf hrung und Motivation Quelltextreferenz Quelltextreferenzen sind Typspezifikationen Methoden oder Konstruk toraufrufe sowie Zugriffe auf Felder Variablen Parameter und Enum Konstanten Dies sind allesamt Elemente im Quelltext welche sich auf ein an anderer Stelle deklariertes Element beziehen Z B ist ein Variablenzugriff durch den Variablenamen im Quelltext eine Quelltex treferenz Der Name referenziert die Variable Grundlage der Variable ist jedoch ihre k
183. te gerichtete und angeord nete Graphen Dar berhinaus kann von der verwendeten Programmiersprache be liebig abstrahiert werden Zur Erzeugung der TGraphen werden programmier sprachenspezifische Faktenextraktoren ben tigt Im Rahmen der Studienarbeit von Arne Baldauf und Nicolas Vika wird unter der Leitung von Prof Dr J rgen Ebert und Dr Volker Riediger ein Faktenex traktor f r Java Quelltexte entwickelt Der Javaextraktor generiert eine TGraph Repr sentation der Quelltexte eines in Java implementierten Softwareprojekts Der erzeugte TGraph ist dann durch die Werkzeuge des Gupro Projekts weiter verarbeitbar Der Javaextraktor parst Javaquelltexte bis einschlie lich Javaversion 6 und setzt diese in TGraphrepr sentationen um Dazu wird im Rahmen der Studienarbeit ein Werkzeug gesucht welches den Parsingvorgang bernimmt Zus tzlich wird ein Javametamodell und entsprechendes Schema f r den TGraph entwickelt Meta modell und Schema geben Typisierung Attributierung und Struktur des TGraphen vor Inhaltsverzeichnis Inhaltsverzeichnis 1 Einf hrung und Motivation 1 1 1 Erkl rung der Begrifilichkeiten 2 Anforderungsliste Javaextraktor 5 2 1 Funktionale Anforderungen 5 2 2 Nichtfunktionale Anforderungen 6 3 Onlinerecherche nach einem Javaparser 8 3 1 Bewertungskriterien f r die gefundenen Werkzeuge 8 32 Ergebnis der
184. ten Wie diese typisiert attributiert und im Falle von Kanten gerichtet sind legt das Metamodell fest Das Metamodell wird durch ein UML Klassendiagramms definiert Dabei repr sentiert jede Assoziation einen Kan tentyp und jede Klasse einen Knotentyp Schema Das Schema ist die textuelle Beschreibung des Metamodells in UML Aus dem Schema k nnen automatisiert Klassen erzeugt werden welche Knoten und Kantentypen rea lisieren Dabei bekommenen Klassen die eine Kante implementieren den Assoziationsnamen zum Klassennamen Das Schema wird in ein einer TG Datei dem JGraLab Dateiformat 11 festgelegt 5 2 Anforderungen an das Metamodell Der Guproansatz soll den Entwickler bei der Softwarewartung unterst tzen Das heisst dass dieser bei der Arbeit mit den Instanzen des Modells sprich den TGraphen auch wie ein Softwareentwickler denken k nnen soll Im Allgemeinen soll f r die Softwarewartung sein Verst ndnis f r das System gef rdert werden Dadurch ergeben sich folgende Anforderungen an das Metamodell l Das Metamodell soll eine feink rnige Graphenrepr sentation des Quelltextes erm gli chen Dabei soll sich das Metamodell nicht zu stark an die Syntax von Java anlehnen aber auch nur so weit davon abstrahieren dass es einem Entwickler im Sinne des Gu proansatzes f rderlich ist l5 Zus tzlich sind die Elemente geordnet Dies kann jedoch nicht im Metamodell ausgedr ckt werden 19 5 Metamodell f r Java 5 2 D
185. tes Verwendung Bei den Programmen des GCC Projektes handelt es sich um Kommando zeilenprogramme so auch beim GJC und bei Bison Rechercheergebnis letztes Update Oktober 2005 Wiki Handbuch FAQ API Spezifikation Mailingliste C da Bison Parser n C 2 Tabelle 21 bersicht GCJ C 4 2 Java Espresso Eine kurze bersicht zu den wichtigsten Daten von ANTLR findet sich in Tabelle 22 Die Arbeitsweise dieses Compilers 1st ausf hrlich auf der Homepage siehe 33 dokumen tiert Dieser baut beim Parsen einen AST auf Danach wird das Type Checking durchgef hrt 108 C 5 Eclipse indem von jedem Knoten die Methode typeCheck aufgerufen wird die Knoten sind in Klas sen beschrieben Um dabei beispielsweise die Sichtbarkeiten aufzul sen bedient sich Espres so einer eigenen Typhierarchie Rechercheergebnis Tabelle 22 bersicht Java Espresso Parser in Java C 5 Eclipse Historie Die hinter Eclipse stehende Organisation wurde im November 2001 als Gemein schaftsprojekt mehrerer gro er IT Firmen gegr ndet Borland IBM MERANT QNX Soft ware Systems Rational Software Red Hat SuSE TogetherSoft Webgain Seitdem ist die Zahl der Mitgliedsfirmen erheblich gewachsen und die Organisation wurde zwischenzeitlich zu einer gemeinn tzigen non profit Organisation umfunktioniert siehe 1341 Vor diesem Hintergrund ist die Aktualit t der Versionen aktuell 3 1 2 vom 18 01 2006 selbstverst
186. tikel API Spezifikation Wiki in Arbeit Suppor Parsergenerator in Parser in Grammatiken f r Unterst tzte OS Tabelle 17 bersicht ANTLR 102 C 3 Werkzeuge die Parsergeneratoren benutzen C 3 1 JAbstract A full Abstract Syntax and Parser for Java Eine kurze bersicht zu den wichtigsten Daten von JAbstract findet sich in Tabelle 18 Historie Die Forschungsgruppe um Sebastian Danicic an der Goldsmiths Universit t Lon don besch ftigt sich unter anderem mit Programmtransformationen Daraus ging auch JAb stract hervor Mittlerweile wird dieses Projekt nicht mehr weiterentwickelt da sich die For schungsgruppe anderen Ans tzen zugewandt hat Charakterisierung JAbstract ist ein Framework welches Javaklassen zur Programm transformation mittels eines AST bereitstellt Um den AST in dem selbst noch die Kom mentare enthalten sind aufzubauen nutzt JAbstract eine JavaCC Grammatik die aber nur Java bis Sprachversion 1 1 verarbeiten kann Literatur Die Dokumentation zu diesem Projekt ist leider sehr sp rlich Auf der Homepa ge siehe 28 kann man nur die Quelltexte und die zugeh rige mit Javadoc erzeugte API Beschreibung einsehen Verwendung Der Parser von JAbstract wurde schon erzeugt lediglich die Quelltexte m s sen noch kompiliert werden Danach kann der Parser ber die Kommandozeile aufgerufen werden Als Parameter gibt man ihm die zu parsende Klasse mit Eigene Erfahrungen Liest man die wenigen Z
187. ufzeit weiterhin die Bibliotheken von ANTLR ben tigt Umfangreicher und detaillierter geht Anhang E auf die Funktionsweise von ANTLR ein 4 2 1 Javagrammatik f r ANTLR F r den Javaextraktor wurde die Javal sung von Michael Studman 18 ausgew hlt da sie Grammatiken f r den Lexer Parser und Treewalker umfasst und die daraus erzeugten Pro gramme in den Parsingtests am besten abschnitten Zus tzlich kann der erzeugte Parser die Quelltexte des Java Developer Kit Version 1 5 06 Eclipse und ANTLR Version 2 7 6 fehler frei parsen Mit hoher Sicherheit kann behauptet werden dass g ltiger Javacode zuverl ssig erkannt wird CUP kann keine eigenen Lexer erzeugen Es muss zun chst ein passender Lexer geschrieben oder mit einem Scannergenerator wie JLex 21 erzeugt werden Kompilierbar durch javac 13 4 ANTLR Grunds tzlich k nnen alle Quelltexte geparst werden die in ASCII ANSI mit verschiedenen Codepages und Unicode UTF 7 UTF 8 Unicode Big Endian codierten Dateien vorliegen Nur Quelltexte die Bezeichner mit Sonderzeichen oder Unicode Escapesequenzen enthalten k nnen nicht erfolgreich geparst werden Zum Parsen der Javaquelltexte sollte der erzeugte Parser verwendet werden Die Erzeugung der TGraphrepr sentation sollte dann durch den Treewalker w hrend der Traversierung der abstrakten Syntaxb ume geschehen 4 3 N tige Anpassungen Vor der Implementierung des eigentlichen Javaextraktors waren noch A
188. ugs xeoug Suns aweu o Bus aueu o SIBUIPOJN edA a Bugs aueu o juaumjejs uorssaudx3 Joynuep uoge ynedsedA E Jeyipojy uoneyouuy TO T I TO E I 1 x I Pw 4MJouonipuo5s JO9SuieN9IqeueAs aiqeue SUIPOWS oLpeypenys 9igeueAOdozienms eigeueAjoed Is eigeeAjouonexouuys JOQUSULS JOSWEN SGETS I T T t T T I I I eqe E JUSUIJEIS e weweszejs E k Apoggo3u ul e ssi 104 Abbildung 14 Metamodell Teil 7 12 54 65 E uoissa4dx3 wwowezejs C I 170 I JO9 qejeuunuas 40107193 S Jouonezijeniu jojqeuieAunys esne ju e3104jO4e3eurejeqgs JOUOHIpuoDJ03s T I I I I snepypezo asnep4ogjeuoypes CH uoissa4dx3 quawajeys C uoisse4dx3 2 uoisse4dx3 I I 1 I I To I 9 uMJOUOnIpuo5s 104JO pogdooqs 26 yoa essaws Sjlym3oApogdooss 40 eoHs os uonipuo5s BET JopeeHs HESSYJQUONIPUODS I I I I uee oog D I I L I Buys euieNpeyrjenoOApnj n Bus aueu n ett CH alum E uessy u q dALSI quawajeys Abbildung 15 Metamodell Teil 8 12 55 A Metamodell der Graphklassen poa 6 uoissaeJdx3 I I Jo pogpez
189. und ANSI Varianten mit verschiedenen Codepages 31 an der Zahl zum Einsatz Zun chst haben wir die Formate aussortiert die auch javac nicht verarbeiten konnte Dabei fielen alle Unicode Varianten und die ASCII Varianten mit den Codepages 37 500 875 und 1026 heraus Alle brig gebliebenen akzeptierte der Parser anstandslos Ein testweises Parsen der 8 von javac nicht akzeptierten Formate schlug in allen F llen ebenfalls fehl Tabelle 24 zeigt eine bersicht ber alle getesteten Formate Encoding Beschreibun ANS osa hf at 737 Griechisch 008 ja ja Baltisch DOS Osieurop isch DOS OEM kyrillisch 127 D Erweiterte Tests des ANTLR generierten Parsers MS Koemish aa Ast 950 Ci Tons igs ja T ANS 1257 West nd je Griechisch Windows mt I T rkisch Windows Th ja VUSASIT a Unicode UTED nen Unicode a nein Unicode E nen nein Uncode BigEwa mea Tabelle 24 bersicht aller getesteten Textencodings D 3 3 Fazit Bei den m glichen Encoding Verfahren f r Quelltext akzeptiert der Parser alles was auch vom Java Compiler verarbeitet werden kann Allerdings schl gt das Parsing bei der Verwendung von Sonderzeichen und Unicode Escapesequenzen in Klassen Variablen Methodenbezeich nern etc komplett fehl so dass die Grammatik in dieser Hinsicht eventuell noch berarbeitet werden m sste 128
190. von Parser und Treewalker blieben unver ndert da diese von dem so geschaffenen Mechanismus nicht tangiert werden 4 3 4 Fehlende Quelltextelemente Neben Kommentaren wurden in der urspr nglichen Grammatik auch weitere Elemente aus dem Quelltext nicht in den AST aufgenommen Diese Elemente werden im Extraktor ben tist um die L nge von allen Javasprachkonstrukten berechnen zu k nnen z B f r den Rumpf einer Klasse Dabei handelte es sich um Semikola Klammern und bislang fehlende Schl sselworte Entsprechend wurden die Parser und Lexergrammatiken erweitert so dass diese Elemente nun in den AST aufgenommen und vom Treewalker korrekt behandelt werden k nnen P Siehe dazu Kapitel 6 3 Siehe dazu Kapitel 7 2 18 5 Metamodell f r Java 5 Der Javaextraktor erzeugt einen TGraphen Dieser wird durch ein Metamodell beschrieben Es wird deshalb eines f r den Javaextraktor ben tigt Dieses Kapitel definiert zun chst die Begriffe Metamodell und Schema und beschreibt anschlie end die Anforderungen an das spe zifische Metamodell f r Java 5 5 1 Begriffsdefinitionen Metamodell Ein Modell beschreibt die Menge aller seiner m glichen Instanzen Ein Meta modell beschreibt wie ein Modell aussehen kann und somit die Menge aller seiner m glichen Instanzen welche Modelle sind Im Sinne der Studienarbeit ist jeder Graph der aus einem Quelltext extrahiert wird ein Modell dieses Quelltextes Ein Graph besteht aus Knoten und Kan
191. weu n JoyRnuep E T JO9UJENS JOosuieNpoyrjenos s dA u ning d n edA1u ping ewewpeyreno uesjoog n 6uuas Bugs oweu n jouoniuyeqedAis zk odAL e I uome ymnedsedA C I JO9d nuueure s suoisueuuip n I I DUU aueu n s unu pi E E 3ueuinfuyejduuis I de JO1ueuinBaypaeopiMs JO13ueuunDuyejduuiss JO9SuueNeBesfuoej1eurejedged s I I I a esniopwesegsdAL 6 juawn uyadAL uone yi oedsed jjO3uouunbayed s Abbildung 11 Metamodell Teil 4 12 5I A Metamodell der Graphklassen poi Jo32nu3suo 2ne1SJO pogs E Bugs oweu n SIOyIPoyy d uoneooodsodA E E uojge yredsedA E Spa zk R Tr T Jo32nJ3suoJjO Jo93euueJeds Jo32nu3suo5jOJe3euuejeqed Is J032nu3suo5jo Apoags I AOPNAJSUODJOOWENS Jo32nujsuo5 guMoAJu juondeoxa3s Jo32nu31su05JOJ9UIpolws Jozijeniu 2 e1sjOApogs ueoJoog JeuJe1xe 6uuns Bugs aueu n Bugs uonejouuy amp ed E uoniugequezijeniu pres uoniuyegao32nasuo E 19quiejjouone3ouuys Jequiej
192. wicklung einer neuen Grammatik f r ANTLR basierend auf dem Metamodell von Hinterw ller bedingt Da in dieser Studienarbeit der Fokus auf der Erstellung des Graphen und nicht so sehr auf dem Parsen der Klassen lag wurde die Entscheidung gef llt ein eigenes Metamodell zu ent wickeln welches aus der Javagrammatik f r ANTLR hergeleitet werden sollte Als Vorlage f r die Herleitung und das zu erreichende Abstraktionsniveau waren die Ergebnisse von Hin terw ller dennoch sehr hilfreich Die Erstellung eines eigenen Modells trug schlie lich auch sehr zum Verst ndnis f r die Vor gehensweise bei der Umwandlung vom Quelltext zum Graphen bei Im n chsten Abschnitt wird das selbstentwickelte Metamodell beschrieben 5 4 Eigenes Metamodell f r Java 5 Das Metamodell wurde aus der Javagrammatik zu ANTLR hergeleitet Damit sich das Meta modell nicht zu stark an die Syntax von Java anlehnt sind inh rente Pr zedenzen der Syntax 6Diese m ssen Guprokonform im TGraph mitgespeichert werden zwecks Nutzung durch den graphenbasierten Sourcecodebrowser 20 5 4 Eigenes Metamodell f r Java 5 nicht im Metamodell vertreten Abstrahiert wurde ber alle Klammerausdr cke Diese sind nur implizit durch Strukturen im Metamodell ausgedr ckt Alle Schl sselworte aus Java haben ein Pendant als Knoten oder Kantentyp im Metamodell Klassen und Attributsnamen im Modell sind in Anlehnung an Javatermini gew hlt Jeder Knotentyp bezeichnet m glich

Download Pdf Manuals

image

Related Search

Dokument_1 dokument 1 dokument 1 word dokument 11 dokument 10 dokument 12 dokument 13 dokument 19 dokument 17 dokument 1 microsoft word dokument 15 dokument_1 document_1 dokument1 - word dokument 123 dokument 14 document1 document1 word dokument_2025 document1 microsoft word dokument_2024 dokument_2024_04_07_125018 eur 1 dokument dokument hfb 13 euro 1 dokument dokument 1880 himmler

Related Contents

コンパクトクールキット 取扱説明書  AsBase - Askom  White Rodgers 37-7248A Thermostat User Manual  Arrestation par la police : Mode d`emploi  Samsung GT-E1070 Benutzerhandbuch  DATOSPIR  Kingston Technology ValueRAM KVR13N9S8H  Funktionen Hinweise Hinweise  

Copyright © All rights reserved.
Failed to retrieve file