JavaCC: Variablen zaehlen

Status
Nicht offen für weitere Antworten.

air_canada

Mitglied
Ich arbeite gerade an meiner Masterarbeit. Dabei soll es darum gehen, Quellcodedateien in verschiedenen Programmiersprachen einlesen zu koennen und daraus Softwaremetriken zu extrahieren. Moechte ich beispielsweise die Halstead-Metrik berechnen, so benoetige ich eine Unterscheidung zwischen Variablen bzw. Konstanten und Schluesselworten der Sprache.

Derzeit gehe ich wie folgt vor: ich lese die Datei (vorerst eine Java-Quellcodedatei) mit einem generierten Javaparser ein und klappere anschliessend den Tokenstream durch. Dann sammle ich alle Identifiers in eine Map. Nun ist mein Problem, dass sich darin sowohl Schluesselworte wie System, writeln, getAbsolutePath, etc. befinden als auch die gewuenschten Variablennamen (z.B. myString, c, i, etc.).

Wie kann ich nun am besten vorgehen, um die Schluesselworte von den Variablen zu unterscheiden? Eine Moeglichkeit waere natuerlich eine Datei anzulegen, in der saemtliche Java Schluesselworte und Methodenbezeichner abgelegt sind und diese auszufiltern. Das erscheint mir ein unmachbarer Aufwand zu sein. Gibt es auch eine Mioeglichkeit das jj-File insofern anzupassen, dass ich gleich beim Token erzeugen einen anderen Typ (kind) fuer Variablen und Konstanten ausgeben kann?
 

0x7F800000

Top Contributor
Naja, die schlüsselwörter kriegst du ja wohl auch so raus, sind 50 stück, kopier die aus irgendeinem Buch in deinen code, und schon kannst du sie erkennen...

Auf die restlichen Bezeichner lässt du dann Reflection los, fragst für jedes wort ab, ob es eine solche Klasse gibt, dann fragst du jede solche klasse, ob es da die und die methode gibt, und was nach dieser abfragerei übrig bleibt müssten dann eigentlich die variablenbezeichner sein. ???:L

Falls jemand vollkommen idiotischen code schreibt, und seine gewöhnliche Variablen als "Frame" und "UnmodifiableSetException" nennt, dann musst du eben nochmal genauer nachschauen, ob die gefundenen klassen auch in den importierten packages liegen und wirklich verfügbar sind. Da sollte man schon eine recht vernünftige Statistik hinbekommen, meine ich.

Was alle anderen Sprachen angeht: nicht java => keine Reflection => Viel Spaß beim größten compilerbauabenteuer deines lebens^^:eek: Oder kA was man da machen soll...
 

air_canada

Mitglied
Danke fuer den Ansatz. An Reflection hatte ich noch gar nicht gedacht... allerdings sollte es wirklich fuer verschiedene Programmiersprachen funktionieren, daher werde ich den Weg wohl nicht einschlagen...

Die Schluesselwoerter bekomme ich heraus. Die muessen vom Compiler ja sowieso besonders behandelt werden und sind daher als Tokens gekennzeichnet.

Es geht im Grunde nur darum Bezeichner auszuklammern, die vom JavaSDK kommen. Aber ich glaube das wuerde zu aufwaendig... vielleicht zaehle ich die einfach mit zu den Variablen dazu.
 

air_canada

Mitglied
Nun ja, zumindest sollte eine syntaktische Analyse fuer C, C++, Java, VB und evtl. noch ein, zwei weitere Programmiersprachen ermoeglicht werden.
 

Wildcard

Top Contributor
Sorry, aber du generierst dir einen Parser, benutzt aber nur den Lexer?
Du brauchst einen AST und die gibt's auch fertig wenn du deinen eigenen Fähigkeiten als Parser-Bauer nicht traust.
Du kannst zB den von Eclipse nehmen, oder die fertige Java Grammatik für ANTLR benutzen. Der generiert dir einen AST.
 

air_canada

Mitglied
Ich bin nun mit meinem Projekt recht gut vorangeschritten. Ich benutze JavaCCs Parser zur lexikalischen Analyse (Bildung einer Tokensequenz) der Eingabedatei.

Nun moechte ich gerne einen AST der Datei bilden. Dabei bin ich vorerst auf die Sprache C++ limitiert. Meine Versuche zur Generierung des AST mit JJTree scheitern jedoch bislang klaeglich. Das Problem scheint zu sein, dass das Parsen der Eingabedatei fehlschlaegt (beispielsweise bei einem simplen "using namespace std;"). Ich verwende die C++ grammar, die sich im Grammar repository von JavaCC finden laesst.

Hat jemand Erfahrung mit dem Erstellen von ASTs von C++ Eingabedateien?
 

air_canada

Mitglied

Danke fuer den Hinweis. ANTLR habe ich auch schon ausprobiert. Dabei hatte ich andere Grammatiken fuer C++ aus dem Grammar-Repository verwendet und konnte jedoch keine der Quellcodedateien erfolgreich parsen...
Allerdings muesste ich bei der Grammatik, die Du vorgeschlagen hast, ja bei der Grammatikdefinition auf Packete aus der Netbeans-IDE zurueckgreifen:

import org.netbeans.modules.cnd.modelimpl.parser.*;
import org.netbeans.modules.cnd.modelimpl.parser.Enum;
import org.netbeans.modules.cnd.modelimpl.debug.*;

Gibt es einen Weg ohne Netbeans einzubinden (entwickle unter eclipse)?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaCC to create my only syntax Allgemeine Java-Themen 5
H javacc Stringzerlegung Allgemeine Java-Themen 4
S Suche Tipps für Einstieg in JavaCC Allgemeine Java-Themen 2
K JavaCC Tokens Allgemeine Java-Themen 4
S JavaCC : SKIP Token nur für bestimmten Bereich ?? Allgemeine Java-Themen 2
B Recordbasiertes File mit javacc einlesen Allgemeine Java-Themen 2
P triviale JavaCC Grammatik inkorrekt Allgemeine Java-Themen 6
P JavaCC 4.0 unter Eclipse 3.2.2 instalieren, wie ? Allgemeine Java-Themen 2
C Erste Schritte Variablen in abhängigkeit von Git branch Allgemeine Java-Themen 7
Fabiator Variablen Variablen Zählen Allgemeine Java-Themen 3
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Fehler bei Variablen Allgemeine Java-Themen 2
N File Path mit Variablen angeben Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
P static Blocks und variablen Allgemeine Java-Themen 41
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
C Variablen Variablen mit unendlichem Wert Allgemeine Java-Themen 22
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
T Maximale Felder maximale Variablen Allgemeine Java-Themen 2
W Lebendige Variablen herauslesen Allgemeine Java-Themen 1
K Summierung einer Variablen Allgemeine Java-Themen 5
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
K Static Variablen verbieten Allgemeine Java-Themen 10
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
F Variablen Variablen schachteln Allgemeine Java-Themen 6
7 6 int variablen vergleichen Allgemeine Java-Themen 34
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
R Übergreifende Variablen? Allgemeine Java-Themen 10
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
C Classloading und statische Variablen Allgemeine Java-Themen 2
K Variablen speichern Allgemeine Java-Themen 2
S Variablen bei Aufruf zurücksetzen Allgemeine Java-Themen 4
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
J Statische Variablen, Threadübergreifend. Allgemeine Java-Themen 4
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
P Variablen in einer anderen Klasse auf Änderungen überwachen Allgemeine Java-Themen 12
V Typargument einer Variablen erfragen Allgemeine Java-Themen 4
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
G Thread variablen Sichtbarkeit Allgemeine Java-Themen 15
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
T Mit JNI finale Variablen überschreiben Allgemeine Java-Themen 14
T JNI -> auf Java-Variablen etc zugreifen Allgemeine Java-Themen 6
M Bezeichnung für Component-Variablen Allgemeine Java-Themen 6
M Variablen an Java-Programm übergeben Allgemeine Java-Themen 3
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
A Überschreibung von Variablen Allgemeine Java-Themen 3
B globale und lokale Variablen Allgemeine Java-Themen 17
G referenz von variablen Allgemeine Java-Themen 9
O getRuntime().Exec() - Environment - Variablen setzen? Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
N Variablen eines Objektes (instanz) in einen Array lesen Allgemeine Java-Themen 7
S In Subklasse auf private Variablen zugreifen Allgemeine Java-Themen 4
S Variablen und ihre Tücken. Allgemeine Java-Themen 7
C Binärbereich einer Variablen abfragen Allgemeine Java-Themen 8
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
C dynamische variablen Namen! Allgemeine Java-Themen 4
M Int und String Variablen verändern Allgemeine Java-Themen 10
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
P Objekt- Variablen Allgemeine Java-Themen 16
K Environment Variablen per java -D weitergeben Allgemeine Java-Themen 9
D in class-Dateien nach variablen suchen! Allgemeine Java-Themen 5
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
L Sichtbarkeit von Variablen / getMethode Allgemeine Java-Themen 4
H Variablen (A1, A2, A3 mit A_irgendetwas aufrufen) ohne Array Allgemeine Java-Themen 5
M Variablen in einer .doc Vorlage ersetzen Allgemeine Java-Themen 4
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
E Zugriff auf Variablen äusserer Klassen Allgemeine Java-Themen 2
M Variablen in Klasse verpacken? Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben