aus Text Kommentare entfernen

Status
Nicht offen für weitere Antworten.

robochris

Aktives Mitglied
Hallo Zusammen,

folgendes Programm würde ich gerne schreiben, weiss aber nicht genau, wie die beste Lösung ist:

1. Gegeben ist ein Text-File, z.B. eine Java Source File
2. Die Kommentare fangen alle mit // an
3. ich möchte den Text hinter // in jeder Zeile entfernen

In einer späteren Version möchte ich #defines erkennen und jeden Text ersetzen, also:

1. gegeben sind defines wie z.B.
#define zahl 1234
2. im Text kommt z.B. folgendes vor:
print(zahl)
3. jetzt muss das Programm alle "zahl" durch 1234 ersetzen

Hat jemand eine Idee, wie ich anfangen könnte?

Gruß,
chris
 

Wildcard

Top Contributor
Ich würde da mit einem AST rangehen. Mit allen anderen Varianten wirst du früher oder später an Grenzen stoßen.
 

robochris

Aktives Mitglied
Ich würde da mit einem AST rangehen. Mit allen anderen Varianten wirst du früher oder später an Grenzen stoßen.
Brauch ich da eine Säge? Ausser die Dinger am Baum kenn ich keine Äste
:D

Mein Problem ist ein wenig folgendes:

Eine große Datei liest man anscheinend am besten in einen StringBuffer ein:
Code:
String line=new String();

try{
in=new BufferedReader(new FileReader("test.txt"));
buffer = new StringBuffer();
while((line=in.readLine())!=null) {
line=line.toLowerCase();
buffer.append(line).append('\n');
}

Die Frage ist: Wie kann ich den StringBuffer nachher am besten Zeilenweise wieder auslesen?
 

GilbertGrape

Bekanntes Mitglied
Also wenn es jetzt nur um die Kommentargeschichte geht, brauchst du doch nur nach // suchen und dann bis zum nächsten \n löschen.
 

robochris

Aktives Mitglied
Also wenn es jetzt nur um die Kommentargeschichte geht, brauchst du doch nur nach // suchen und dann bis zum nächsten \n löschen.

Das mit der Kommentargeschichte wäre natürlich einfach. Ich möchte aber einen Assembler für einen Mikrocontroller schreiben.

Dazu muss ich folgendes tun:

1. alle Kommentare aus Code entfernen
2. alle #defines finden und den Text im Code durch den Text der defines ersetzen
3. alle Sprunglabel im Code finden
4. alle Befehler parsen
5. alle Spruglabel in den Befehlen ersetzten

Um mich dem Problem ein wenig anzunähern, beginne ich mit Schritt 1: Kommentare aus Text entfernen

Dazu sehe ich folgend Möglichkeiten:

1.Datei Zeilenweise auslesen
2. Kommentare Zeilenweise entfernen
3. Datei Zeilenweis abspeichern.

Mir scheint es aber eventuell besser, erst die Datei vollständig einzulesen und dann den zu verändernden und zu interpretierenden Text im Speicher hallten.
 
B

Beni

Gast
In meinem C-Preprocessor, den ich vor einigen Monaten schrieb, habe ich einen neuen InputStream geschrieben, der Kommentare entfernt. Das ist nicht sehr schwierig (sobald ein // erkannt wird, werden Zeichen weggeworfen bis eine neue Zeile kommt...), ziemlich schnell in der Bearbeitung und dein Programm bemerkt nichtmal dass da an den Dateien rumgespielt wird beim lesen.

Da du noch nicht weisst was ein AST ist (Abstract Syntax Tree) würde ich dir aber erstmal empfehlen ein bisschen was über Parser/Compiler zu lernen bevor du beginnst zu Programmieren. Es gibt tolle Libraries die dir viel Arbeit abnehmen können (persönlich benutze ich CUP als Parsergenerator und JFlex als Lexergenerator).den Vorteil, dass
 

xysawq

Bekanntes Mitglied
Na dann viel Spaß bei deinen Roboterbauten ^^.

Mir ist das ganze ab Schritt 3 zu hoch... ;)

Und für Schritt 2 müsste ich zu lange grübeln, hab jetzt aber Schicht im Schacht ^^.


Schönen Feierabend.
 

robochris

Aktives Mitglied
Da du noch nicht weisst was ein AST ist (Abstract Syntax Tree) würde ich dir aber erstmal empfehlen ein bisschen was über Parser/Compiler zu lernen bevor du beginnst zu Programmieren. Es gibt tolle Libraries die dir viel Arbeit abnehmen können (persönlich benutze ich CUP als Parsergenerator und JFlex als Lexergenerator).

Jaja, ich weis schon, dass es viele vorgefertigte Verfahren gibt. Ich möchte aber etwas über Java lernen und der Parser für einen Assembler ist ziemlich einfach ( keine Schachtelungen ), deshalb glaube ich auf AST, JFLEX, YACC verzichten zu können.

Was ich brauche ist eine Methode, um den StringBuffers Zeilenweise auszulesen. Man könnte einfach nach "\n" suchen und damit die einzelnen Zeilen des StringBuffers auslesen.

Die Frage ist: geht's einfacher?
 

FArt

Top Contributor
Noch mal, falls das nicht klar rausgekommen sein sollte:

Nur mit den Kommentaren und den defines kommst du nicht weit, das ist langweilig... du brauchst einen Parser (dein Punkt 4 schreit danach). Da kannst du auch sehr viel lernen.

Hiermit habe ich schon gute Erfahrung gemacht: http://antlr.org/
 

robochris

Aktives Mitglied
Nur mit den Kommentaren und den defines kommst du nicht weit, das ist langweilig..

Für einen Experten ist es sicherlich langweilig. Was Java anbelangt, bin ich aber keiner. Deshalb muss ich klein anfangen.

Jetzt habe ich hier mal einen Code für die Kommentarentfernung geschrieben, ich hoffe, er erscheint euch nicht zu umständlich.

Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;

public class LineReader 
{	
	ArrayList<String> buffer=new ArrayList<String>();
	
	public ArrayList<String> getBuffer()
	{
		return buffer;
	}
	public String removeComment(String line)
	{
        int i=line.indexOf("//",0);
        if(i!=-1)
        {
    	   line=line.substring(0,i); // remove comment
        }
        return line;
	}
	public ArrayList<String> removeComment(ArrayList<String> input)
	{
		ArrayList<String> result=new ArrayList<String>();
		
		for(int n=0;n<input.size();n++)
		{
			result.add(removeComment(input.get(n)));
			//System.out.println(n+": "+list.get(n));
		}
		return result;
	}

	public void readLines(File fp)
    throws Exception
    {
		BufferedReader in = new BufferedReader(new FileReader(fp));

        String line = null;
        int n=0;
        
        line=in.readLine();
        while(line !=null)
        {         
            System.out.println(line+"  ");
            buffer.add(line);
            n++;
            line=in.readLine();
        }
    }
	public void dumpStringArray(ArrayList<String> list)
	{
		for(int n=0;n<list.size();n++)
		{
			System.out.println(n+": "+list.get(n));
		}
	}

	public static void main(String[] args) 
	{
		String FileName="C:\\Dokumente und Einstellungen\\chris\\Desktop\\test.txt";
		System.out.println(FileName);
		File f = new File(FileName);
		LineReader lr=new LineReader();
		try{lr.readLines(f);}	catch(Exception e){System.out.println("raus");};
		lr.dumpStringArray(lr.getBuffer());
		System.out.println();
		System.out.println("Ohne Kommentare");
		lr.dumpStringArray(lr.removeComment(lr.getBuffer()));
		
	    System.out.println("program ended");
	}

}

0: bla
1: blub
2: hallo
3: // test
4: wirklich // so geht's

Ohne Kommentare
0: bla
1: blub
2: hallo
3:
4: wirklich
program ended
 
B

Beni

Gast
Noch eine Variante (die aber mit einigen Codierungen Schwierigkeiten haben wird. Vielleicht wäre es besser gewesen einen java.io.Reader zu benutzen). Ist nicht unbedingt besser als deines, aber dient vielleicht als Anregung wie es auch möglich wäre.
Code:
package test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class NoCommentInputStream extends InputStream{
    // TEST
    public static void main( String[] args ) throws IOException {
        String file = "test.txt";
        InputStream in = new NoCommentInputStream( new FileInputStream( file ));
        int read;
        while( (read = in.read()) != -1 ){
            System.out.print( (char)read );
        }
    }
    // END TEST
    
    private InputStream in;
    private int last = 0;
    
    public NoCommentInputStream( InputStream in ){
        this.in = in;
    }
    
    @Override
    public int read() throws IOException {
        if( last == 0 )
            last = in.read();
        
        int next = in.read();
        
        if( last == '/' && next == '/' ){
            while( next != '\n' && next != '\r' && next != -1 )
                next = in.read();
            
            last = next;
            next = in.read();
        }
        
        int result = last;
        last = next;
        return result;
    }
}
 

robochris

Aktives Mitglied
Hallo Beni,

Dein Beispiel finde ich ganz gut, weil es sehr schön zeigt, wie man mit Streams arbeitet. Bis jetzt habe ich Streams noch nicht benutzt, aber man sieht ganz gut, wie man es für das Kommentar entfernen verwenden kann.

Besten Dank,
chris
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen JTable bei aktivieren einer Zelle soll Text selektiert werden. Java Basics - Anfänger-Themen 24
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
A Edit Text Negative Decimalzahlen Java Basics - Anfänger-Themen 18
P Aus Text Datei nur Zahlen übernehmen Java Basics - Anfänger-Themen 13
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
R Text in der DB abspeichern, und danach bearbeiten Java Basics - Anfänger-Themen 5
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
JavaBeginner22 Button Text verändern Java Basics - Anfänger-Themen 1
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
A Text zu Morsecode Java Basics - Anfänger-Themen 8
O Java Text Area Zeilenausgabe Java Basics - Anfänger-Themen 7
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
M Text in Datei schreiben Java Basics - Anfänger-Themen 9
T208 Text Datei individuell benennen. Java Basics - Anfänger-Themen 5
A Werten aus dem Text ausliesten Java Basics - Anfänger-Themen 6
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
xFlozen Text mehrspaltig ausgeben Java Basics - Anfänger-Themen 3
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
H Klassen Die Länge einer Text-Node bestimmen Java Basics - Anfänger-Themen 2
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
GermanPie Discord Text Channel erstellen? Java Basics - Anfänger-Themen 1
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
J Java TextArea Text bei hinzufügen makieren Java Basics - Anfänger-Themen 1
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M Java: BufferedReader liest nur die Hälfte der Text-Datei. Java Basics - Anfänger-Themen 4
M Apache POI PPT - Vertikales Alignment von Text im XSLFAutoShape Java Basics - Anfänger-Themen 2
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
J java.text.DecimalFormat Java Basics - Anfänger-Themen 5
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
S Text-To-Speech mit Java Java Basics - Anfänger-Themen 2
L Text-Adventure Java Basics - Anfänger-Themen 3
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
ruutaiokwu Ausgegebene Zeile ersetzen mit neuem Text Java Basics - Anfänger-Themen 3
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
Harlequin Compiler-Fehler Text Adventure - "Long Output" Fehler Java Basics - Anfänger-Themen 3
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
D Text als Code in java-forum.com formatieren. Wie ? Java Basics - Anfänger-Themen 3
F Schreibprogramm nur markierten Text in kursiv oder fett schreiben Java Basics - Anfänger-Themen 3
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
M Erste Schritte Verschlüsselung von text Java Basics - Anfänger-Themen 21
S Text aus einer HTML Datei auslesen Java Basics - Anfänger-Themen 1
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
M Beliebigen Text in *** umwandeln Java Basics - Anfänger-Themen 15
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
F Input/Output Text einlesen lassen Java Basics - Anfänger-Themen 14
L Text eingeben und im Textfeld auslesen lassen Java Basics - Anfänger-Themen 2
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
J Text Datei einlesen Java Basics - Anfänger-Themen 6
L Text und Ganzzahl in einer Dialogbox Java Basics - Anfänger-Themen 5
D Text Adventure Erstellen Java Basics - Anfänger-Themen 10
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
J JTextArea visible ohne Text Java Basics - Anfänger-Themen 3
D Bild zu Text Java Basics - Anfänger-Themen 4
L Text/Befehle zu Programmen senden Java Basics - Anfänger-Themen 1
L Java Text datei nur bis zu einem Punkt auslesen? Java Basics - Anfänger-Themen 3
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
S Erste Schritte Sprachermittler - Datei öffnen, Text in TextArea, Bereinigen, Auswerten Java Basics - Anfänger-Themen 14
S Java Label hat komischen text Java Basics - Anfänger-Themen 4
F Text anhand bestimmter Trennzeichen in Textteile trennen (netbeans) Java Basics - Anfänger-Themen 7
S Ausgabe von Text Formatieren Java Basics - Anfänger-Themen 6
H Text in einen Button quetschen Java Basics - Anfänger-Themen 3
A Text mit "Scanner" eingeben und Umlaute ersetzen Java Basics - Anfänger-Themen 7
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
J Zahlen als Text übersetzen Java Basics - Anfänger-Themen 6
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
R Text Pane Aktualisierung erst nach JOptionPane Java Basics - Anfänger-Themen 10
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
Chava Testprojekt.Text.Image.Button Java Basics - Anfänger-Themen 4
Z JSlider - Text wird nich angezeigt Java Basics - Anfänger-Themen 0
A Problem mit set.Text und übergabe Java Basics - Anfänger-Themen 2
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
M Text innerhalb Anführungsstriche als "eins" auswerten Java Basics - Anfänger-Themen 5
V Text aus einer .txt dynamisch ins applet einpassen Java Basics - Anfänger-Themen 0
H Text durch Checkbox erscheinen lassen Java Basics - Anfänger-Themen 2
U markierten Text auf Zeichen zuvor/danach pruefen Java Basics - Anfänger-Themen 9
J Dienst zum Text kopieren und Variable hochzählen Java Basics - Anfänger-Themen 7
L Text verschlüsseln Java Basics - Anfänger-Themen 13
M Button mit Bild und Text Java Basics - Anfänger-Themen 2
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben