forked from IF-LK-2020/rechenmaschine
Aufgabe 4 fertig & Switch cases durch bessere ausgetauscht
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -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
|
||||||
|
|||||||
@@ -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;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
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();
|
||||||
|
|||||||
Reference in New Issue
Block a user