Kommentar aus dem Source löschen?

Hallo!

Kennt jemand einen Parser der aus einer xyz.java Datei
die Kommentare entfernt?

Also aus:

Tuwas.java

/\*
 \* hier stehen Kommentare ...
 \*
 \*/
public class Tuwas{

 public Tuwas(){
 System.out.println("Constructor called."); //dieses Kommentar muss weg
 // dieses Kommentar muss auch weg
 }

 ...
}

Jetzt ruft man die Klasse CommentRemover auf:

java packagename.CommentRemover Tuwas.java comment\_free\_Tuwas.java

Der reduzierte Code der comment_free_Tuwas.java:

public class Tuwas{

 public Tuwas(){
 System.out.println("Constructor called.");
 }

 ...
}

Hat jemand schon mal soetwas gefunden?

Danke Christian

Kennt jemand einen Parser der aus einer xyz.java Datei
die Kommentare entfernt?

Ich kenne zwar kein fix fertiges Tool, dass eine derartige „Verstümmelung“ des Sorucecodes vornimmt, schätze aber, dass es mit Perl in ca. 5 Minuten zu schaffen sein sollte, ein entsprechendes Skript zu schreiben - zumindest dann, wenn die Quelltexte nicht allzulange werden.

Erwin

Hallo Erwin,

5 Minuten ? Nicht schlecht - da bist Du doch bestimmt fit in regulären
Ausdrücken. Die wollte ich mir nicht unbedingt neu überlegen und auf
geprüfte bzw. fertige Quellen zurückgreifen.
Mit einem Perl-Skript könnte ich auch was anfangen und es nach JAVA
umschreiben.
Also mein Angebot: Du machst das Perl-Skript ich die Portierung.
Bedingung: Der Code muss von Dir sein, falls ich Rückfragen habe.

Gruß Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ich habe folgendes mal bei mir probiert:

#!/usr/bin/perl -w

use strict;

my $content = "";

if ($#ARGV )
 {
 $content=$content.$\_;
 }
 close(FILE);

 # Innerhalb von Strings '//' durch '+((char)47)+((char)47)+' ersetzen
 $content =~s/"([\w\s]\*?)\/\/([\w\s]\*?)"/"$1"+((char)47)+((char)47)+"$2"/g;
 # Einzeilige Kommentare //xxx
 $content =~s/\/\/.\*//g;

 # Mehrzeilige Kommentare 
 # /\* ...
 # ...
 # \*/
 $content =~s/\/\*.\*?\*\///sg;

 open(OUT,"\>$ARGV[1]") or die "Cannot open for write: $!";

 print OUT "$content";

 close(OUT);
}

Ist aber mit Vorsicht zu geniessen, ich hab auf die Schnelle vermutlich nicht alle Möglichkeiten bedacht. ( ‚//‘ bzw. ‚/*‘ Kann leider auch innerhalb von Strings vorkommen, und ist dort eben kein Kommentar)

gruß
Heavy

Das müsste auch ohne regulären Ausdruck recht simpel gehen… jedes Zeichen einlesen und direkt wieder rausschreiben in die neue Datei… dabei eben gewisse Zustände merken.,… wenn / und dann * kommt ein Flag „Kommentar“ setzen damit die Zeichen nicht rausgeschrieben werden und dies bei * und dann / wieder wegnehmen, genauso mit zwei / und dann beim zeilenumbruch wieder weg.

Ein zweites Flag könnte z.b. strings erkennen anhand von hochkommas (achtung bei escapes wie ") und dann nicht auskommentieren

Grüße
Bruno