Aufgabe 4 fertig & Switch cases durch bessere ausgetauscht

This commit is contained in:
2021-04-16 19:32:37 +02:00
parent 0718fe16b2
commit cf554d7852
2 changed files with 107 additions and 221 deletions

3
.gitignore vendored
View File

@@ -23,3 +23,6 @@ Dokumente*
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid* hs_err_pid*
.idea
rechenmaschine.iml
out

View File

@@ -35,6 +35,12 @@ public class Rechenmaschine {
return; return;
} }
if( !analyse() ) {
System.out.println("Fehler bei der semantischen Analyse:");
System.out.println(fehler);
return;
}
run(); run();
System.out.println("Ergebnis der Ausführung: " + result); System.out.println("Ergebnis der Ausführung: " + result);
} }
@@ -43,267 +49,130 @@ public class Rechenmaschine {
char[] eingabe = pEingabe.toCharArray(); char[] eingabe = pEingabe.toCharArray();
int state = 0; int state = 0;
String currentToken = ""; StringBuilder currentToken = new StringBuilder();
for(char buchstabe: eingabe){ for(char buchstabe: eingabe){
switch(state){ switch(state){
case 0: case 0:
switch(buchstabe){ switch (buchstabe) {
case '0': case '0' -> {
currentToken+=buchstabe; currentToken.append(buchstabe);
state = 1; state = 1;
break; }
case '1': case '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
case '2': currentToken.append(buchstabe);
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken+=buchstabe;
state = 2; state = 2;
break; }
case '.': case '.' -> {
System.out.println("Am anfang des Termes kann kein . stehen."); System.out.println("Am anfang des Termes kann kein . stehen.");
return false; return false;
case '+': }
case '-': case '+', '-', '*', '/' -> {
case '*':
case '/':
System.out.println("Der Term darf nicht mir mit dem Operator " + buchstabe + " beginnen."); System.out.println("Der Term darf nicht mir mit dem Operator " + buchstabe + " beginnen.");
return false; return false;
default: }
default -> {
System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden.");
return false; return false;
} }
}
break; break;
case 1: case 1:
switch(buchstabe){ switch (buchstabe) {
case '.': case '.' -> {
currentToken+=buchstabe; currentToken.append(buchstabe);
state = 3; state = 3;
break; }
case '+': case '+', '-', '*', '/' -> {
case '-': tokenlist.append(new Token("OPERAND", currentToken.toString()));
case '*': currentToken = new StringBuilder();
case '/': tokenlist.append(new Token("OPERATOR", Character.toString(buchstabe)));
tokenlist.append(new Token("OPERAND", currentToken));
currentToken="";
tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe)));
state = 5; state = 5;
break; }
default: default -> {
System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden.");
return false; return false;
} }
}
break; break;
case 2: case 2:
switch(buchstabe){ switch (buchstabe) {
case '.': case '.' -> {
currentToken+=buchstabe; currentToken.append(buchstabe);
state = 3; state = 3;
break; }
case '0': case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
case '1': currentToken.append(buchstabe);
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken+=buchstabe;
state = 2; state = 2;
break; }
case '+': case '+', '-', '*', '/' -> {
case '-': tokenlist.append(new Token("OPERAND", currentToken.toString()));
case '*': currentToken = new StringBuilder();
case '/': tokenlist.append(new Token("OPERATOR", Character.toString(buchstabe)));
tokenlist.append(new Token("OPERAND",currentToken));
currentToken="";
tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe)));
state = 5; state = 5;
break; }
default: default -> {
System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden.");
return false; return false;
} }
}
break; break;
case 3: case 3:
switch(buchstabe){ switch (buchstabe) {
case '0': case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
case '1': currentToken.append(buchstabe);
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken+=buchstabe;
state = 4; state = 4;
break; }
case '+': case '+', '-', '*', '/' -> {
case '-':
case '*':
case '/':
System.out.println("Nach einem . darf kein Rechenoperator folgen"); System.out.println("Nach einem . darf kein Rechenoperator folgen");
return false; return false;
} }
}
break; break;
case 4: case 4:
switch(buchstabe){ switch (buchstabe) {
case '0': case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
case '1': currentToken.append(buchstabe);
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken+=buchstabe;
state = 4; state = 4;
break; }
case '+': case '+', '-', '*', '/' -> {
case '-': tokenlist.append(new Token("OPERAND", currentToken.toString()));
case '*': currentToken = new StringBuilder();
case '/': tokenlist.append(new Token("OPERATOR", Character.toString(buchstabe)));
tokenlist.append(new Token("OPERAND",currentToken));
currentToken="";
tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe)));
state = 5; state = 5;
break; }
case '.': case '.' -> {
System.out.println("Eine Dezimalzahl kann nur ein . haben."); System.out.println("Eine Dezimalzahl kann nur ein . haben.");
return false; return false;
} }
}
break; break;
case 5: case 5:
switch(buchstabe){ switch (buchstabe) {
case '0': case '0' -> {
currentToken+=buchstabe; currentToken.append(buchstabe);
state = 1; state = 1;
break; }
case '1': case '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
case '2': currentToken.append(buchstabe);
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken+=buchstabe;
state = 2; state = 2;
break; }
case '.': case '.' -> {
System.out.println("Nach einem Operator kann kein . stehen."); System.out.println("Nach einem Operator kann kein . stehen.");
return false; return false;
case '+': }
case '-': case '+', '-', '*', '/' -> {
case '*':
case '/':
System.out.println("Nach einem Operator darf nicht direkt ein weiterer Operator folgen."); System.out.println("Nach einem Operator darf nicht direkt ein weiterer Operator folgen.");
return false; return false;
default: }
default -> {
System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden.");
return false; return false;
} }
break;
}
}
/*
for( char buchstabe: eingabe ) {
switch( state ) {
case 0:
switch( buchstabe ) {
case '0':
tokenlist.append(new Token("OPERAND", "0"));
state = 2;
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken += buchstabe;
state = 1;
break;
case '+':
fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit + beginnen!";
return false;
case '-':
fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit - beginnen!";
return false;
default:
fehler = "Fehler im Wort " +pEingabe+ ":\nDer Buchstabe " + buchstabe + " gehört nicht zur Sprache!";
return false;
}
break;
case 1:
switch( buchstabe ) {
case '+':
case '-':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe)));
state = 0;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken += buchstabe;
state = 1;
break;
default:
fehler = "Fehler im Wort " +pEingabe+ ":\nDer Buchstabe " + buchstabe + " gehört nicht zur Sprache!";
return false;
}
break;
// Prüft auf Rechenzeichen +
case 2:
switch( buchstabe ) {
case '+':
case '-':
tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe)));
state = 0;
break;
default:
fehler = "Fehler im Wort " +pEingabe+ ":\nNach 0 am Anfang muss ein + oder - folgen!";
return false;
} }
break; break;
} }
} }
*/
if( state == 5 ) { if( state == 5 ) {
fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem Operator enden!"; fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem Operator enden!";
return false; return false;
@@ -311,7 +180,7 @@ public class Rechenmaschine {
fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem Operator enden!"; fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem Operator enden!";
return false; return false;
} else { } else {
tokenlist.append(new Token("OPERAND", currentToken)); tokenlist.append(new Token("OPERAND", currentToken.toString()));
return true; return true;
} }
} }
@@ -331,16 +200,18 @@ public class Rechenmaschine {
return false; return false;
} else if( currentToken.getType().equals("OPERAND") ) { } else if( currentToken.getType().equals("OPERAND") ) {
state = 1; state = 1;
break;
} else { } else {
fehler = "Unbekanntes Token: "+currentToken.getType(); fehler = "Unbekanntes Token: "+currentToken.getType();
return false; return false;
} }
break;
case 1: case 1:
if( currentToken.getType().equals("OPERATOR") ) { if( currentToken.getType().equals("OPERATOR") ) {
state = 0; state = 0;
break;
} else if( currentToken.getType().equals("OPERAND") ) { } else if( currentToken.getType().equals("OPERAND") ) {
fehler = "Auf einen Operanden muss ein Operator folgen!"; fehler = "Auf einen Operanden muss ein Operator folgen!";
return false; return false;
@@ -348,7 +219,7 @@ public class Rechenmaschine {
fehler = "Unbekanntes Token: "+currentToken.getType(); fehler = "Unbekanntes Token: "+currentToken.getType();
return false; return false;
} }
break;
} }
tokenlist.next(); tokenlist.next();
@@ -362,6 +233,21 @@ public class Rechenmaschine {
} }
} }
public boolean analyse() {
tokenlist.toFirst();
while(tokenlist.hasAccess()){
if(tokenlist.getContent().getToken().equals("/")){
tokenlist.next();
if(tokenlist.getContent().getToken().equals("0")){
fehler = "Es kann nicht durch 0 geteilt werden.";
return false;
}
}
tokenlist.next();
}
return true;
}
public void run() { public void run() {
result = 0; result = 0;
@@ -373,14 +259,11 @@ public class Rechenmaschine {
previous=currentToken.getToken(); previous=currentToken.getToken();
} }
if( currentToken.getType().equals("OPERAND") ) { if( currentToken.getType().equals("OPERAND") ) {
if(previous.equals("+")||previous.equals("")){ switch (previous) {
result += Double.parseDouble(currentToken.getToken()); case "+", "" -> result += Double.parseDouble(currentToken.getToken());
} else if (previous.equals("-")) { case "-" -> result -= Double.parseDouble(currentToken.getToken());
result -= Double.parseDouble(currentToken.getToken()); case "*" -> result *= Double.parseDouble(currentToken.getToken());
} else if (previous.equals("*")){ default -> result /= Double.parseDouble(currentToken.getToken());
result *= Double.parseDouble(currentToken.getToken());
} else {
result /= Double.parseDouble(currentToken.getToken());
} }
} }
tokenlist.next(); tokenlist.next();