Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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
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
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.
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
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.
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.
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;
}
}
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.