Hallo!
Wir sollen dieses Mal als Hausaufgabe einen "kleinen Compiler" schreiben - und zwar soll mithilfe eines Stacks überprüft werden ,ob die Klammersetzung nach java korrekt ist.
Die Strings , chars und Kommentare sollen dabei ignoriert werden.
Bei der Fehlerausgabe soll die Zeilennummer mit angegeben werden - mir ist aber keine Methode des FileReader bekannt ,bei der man die bekommt?
Wir sollen dieses Mal als Hausaufgabe einen "kleinen Compiler" schreiben - und zwar soll mithilfe eines Stacks überprüft werden ,ob die Klammersetzung nach java korrekt ist.
Die Strings , chars und Kommentare sollen dabei ignoriert werden.
Bei der Fehlerausgabe soll die Zeilennummer mit angegeben werden - mir ist aber keine Methode des FileReader bekannt ,bei der man die bekommt?
Java:
import java.util.*;
import java.io.*;
public class JavaChecker {
private static int lineNr = 0;
public static String checkBrackets(String filename) throws FileNotFoundException, IOException {
java.io.FileReader myReader = new java.io.FileReader(filename); // erzeuge Reader für gewählte Datei
java.util.Stack<Integer> stack = new java.util.Stack<Integer>(); // erzeuge einen Stack für Klammerung
int found = myReader.read();
while(found > -1){ //"-1" signalisert Datei-Ende
if (found == '"') { // Anfang eines Strings, also ignorieren
found = myReader.read();
while (found != '"' && found > -1) { // solange nicht ende des Strings kommt
found = myReader.read(); // lese einfach weiter und mache nichts
}
}
if (found == '\'') { // char Zeichen
// Wenn ein char-Zeichen auftritt, sollen einfach die nächsten beiden Zeichen überlesen werden, denn das ist der
// character Wert der ignoriert werden soll und das ' das Ende char signalisiert
found = myReader.read();
found = myReader.read();
}
if (found == '/') {
found = myReader.read();
if (found == '/') { // zwei // signalisieren Kommentar
/** lese bis zum Zeilenende, ignoriere alles **/
}
if (found == '*') { // Kommentar über mehrere Zeilen signalisiert durch /*
found = myReader.read();
while (found != '*') { // */ signalisiert ende, deshalb bis zum Stern lesen und dann schauen ob / kommt
found = myReader.read();
if (found == '/') {
break; // Kommentarende, weiter im Suchen
}
}
}
}
else if (found == '{') {
stack.push(found);
}
else if (found == '(') {
stack.push(found);
}
else if (found == ')') {
if (stack.peek() == '(') {
stack.pop();
}
else if (stack.peek() == '{') {
return (") without (; line Nr " + lineNr);
}
else {
return ("eine schliessende Klammer zu viel");
}
}
else if (found == '}') {
if (stack.peek() == '{') {
stack.pop();
}
else if (stack.peek() == '(') {
return ("} without {; line Nr " + lineNr);
}
else {
return ("eine schliessende Klammer zu viel");
}
}
found = myReader.read();
}
// Am Ende noch überprüfen ob der Keller auch wirklich leer, nur dann Kammersetzung korrekt
if (stack.peek() == null) {
return ("ok");
}
else {
return ("stack not empty on end of file");
}
}
/* Die beiden angegebenen Exceptions können beim Gebrauch des FileReaders ausgelöst werden und sollen nicht in der checkBrackets-Methode aufgefangen und behandelt
sondern weitergereicht werden.
Dabei ist der Text in Kommentaren (beide Formen!) und in String-Werten, der ja beliebig sein kann, zu überspringen; ebenso dürfen Klammern, die als char-Werte
auftreten, nicht mitgerechnet werden! Die Methode soll die folgenden Fehlersituationen erkennen und sofort mit der entsprechenden Meldung returnieren: */
}