Implemented all Operators(+,-,*,/) ,Decimal Point, and a analysis for Division by zero.
This commit is contained in:
Maxim Derksen 2021-04-20 13:21:50 +02:00
parent 5260cdb1f3
commit f165368633
2 changed files with 167 additions and 36 deletions

View File

@ -13,7 +13,7 @@ public class Rechenmaschine {
private String fehler;
private int result;
private double result;
public Rechenmaschine() {
tokenlist = new List<>();
@ -28,6 +28,12 @@ public class Rechenmaschine {
System.out.println(fehler);
return;
}
if(!analysiere()) {
System.out.println("Fehler bei der semantischen Analyse:");
System.out.println(fehler);
return;
}
if( !parse() ) {
System.out.println("Fehler bei der syntaktischen Analyse:");
@ -50,10 +56,9 @@ public class Rechenmaschine {
case 0:
switch( buchstabe ) {
case '0':
tokenlist.append(new Token("OPERAND", "0"));
currentToken += buchstabe;
state = 2;
break;
case '1':
case '2':
case '3':
@ -63,16 +68,24 @@ public class Rechenmaschine {
case '7':
case '8':
case '9':
currentToken += buchstabe;
state = 1;
break;
currentToken += buchstabe;
state = 1;
break;
case '.':
fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem Punkt beginnen!";
return false;
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;
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;
@ -82,18 +95,33 @@ public class Rechenmaschine {
case 1:
switch( buchstabe ) {
case '+':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "+"));
state = 0;
break;
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "+"));
state = 0;
break;
case '-':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "-"));
state = 0;
break;
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "-"));
state = 0;
break;
case '*':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "*"));
state = 0;
break;
case '/':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "/"));
state = 0;
break;
case'.':
currentToken += buchstabe;
state = 3;
break;
case '0':
case '1':
case '2':
@ -117,18 +145,82 @@ public class Rechenmaschine {
case 2:
switch( buchstabe ) {
case '+':
tokenlist.append(new Token("OPERAND", "0"));
currentToken = "";
tokenlist.append(new Token("OPERATOR","+"));
state = 0;
break;
case '-':
tokenlist.append(new Token("OPERAND", "0"));
currentToken = "";
tokenlist.append(new Token("OPERATOR","-"));
state = 0;
break;
case '*':
tokenlist.append(new Token("OPERAND", "0"));
currentToken = "";
tokenlist.append(new Token("OPERATOR","*"));
state = 0;
break;
case '/':
tokenlist.append(new Token("OPERAND", "0"));
currentToken = "";
tokenlist.append(new Token("OPERATOR","/"));
state = 0;
break;
case '.':
currentToken += buchstabe;
state = 3;
break;
default:
fehler = "Fehler im Wort " +pEingabe+ ":\nNach 0 am Anfang muss ein + oder ein - folgen!";
fehler = "Fehler im Wort " +pEingabe+ ":\nNach 0 am Anfang muss ein Operator oder ein Punkt folgen!";
return false;
}
break;
case 3:
switch(buchstabe){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentToken += buchstabe;
state = 3;
break;
case '+':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "+"));
state = 0;
break;
case '-':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "-"));
state = 0;
break;
case '*':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "*"));
state = 0;
break;
case '/':
tokenlist.append(new Token("OPERAND", currentToken));
currentToken = "";
tokenlist.append(new Token("OPERATOR", "/"));
state = 0;
break;
case '.':
fehler = "Fehler im Wort " +pEingabe+ ":\nEs dürfen nicht zwei Punkte in einer Zahl vorkommen!";
return false;
}
}
}
@ -140,6 +232,29 @@ public class Rechenmaschine {
return true;
}
}
public boolean analysiere() {
int state = 0;
tokenlist.toFirst();
while(tokenlist.hasAccess()){
Token currentToken = tokenlist.getContent();
switch(state){
case 0:
if( currentToken.getType().equals("OPERATOR") && currentToken.getToken().equals("/")){
state = 1;
}
case 1:
if(currentToken.getType().equals("OPERAND") && Double.parseDouble(currentToken.getToken()) == 0.0){
fehler = "Durch 0 teilen ist verboten!";
return false;
}else {
state = 0;
}
}
tokenlist.next();
}
return true;
}
public boolean parse() {
@ -188,23 +303,39 @@ public class Rechenmaschine {
public void run() {
result = 0;
int state = 0;
char state = '+';
tokenlist.toFirst();
while( tokenlist.hasAccess() ) {
Token currentToken = tokenlist.getContent();
if( currentToken.getType().equals("OPERATOR")){
if(currentToken.getToken().equals("+")){
state = 0;
state = '+';
} else if(currentToken.getToken().equals("-")){
state = 1;
state = '-';
} else if(currentToken.getToken().equals("*")){
state = '*';
} else if(currentToken.getToken().equals("/")){
state = '/';
} else {
System.out.println("Irgendwas ist schiefgelaufen");
}
}
else if( currentToken.getType().equals("OPERAND") ) {
if(state == 0){
result += Integer.parseInt(currentToken.getToken()); //Konvertiert den String in ein Integer und rechnet es dem Result hinzu
}
else if(state == 1){
result -= Integer.parseInt(currentToken.getToken()); //Konvertiert den String in ein Integer und zieht es dem Result ab
switch(state){
case'+':
result += Double.parseDouble(currentToken.getToken()); //Konvertiert den String in ein Double und rechnet es result hinzu
break;
case'-':
result -= Double.parseDouble(currentToken.getToken()); //Konvertiert den String in ein Double und zieht es von result ab
break;
case'*':
result *= Double.parseDouble(currentToken.getToken()); //Konvertiert den String in ein Double multipliziert es mit result
break;
case'/':
result /= Double.parseDouble(currentToken.getToken()); //Konvertiert den String in ein Double und dividiert result dadurch
break;
default:
System.out.println("Irgendwas ist schiefgelaufen");
}
}
tokenlist.next();

View File

@ -9,16 +9,16 @@ editor.fx.0.height=1416
editor.fx.0.width=2576
editor.fx.0.x=-8
editor.fx.0.y=-8
objectbench.height=111
objectbench.width=1256
objectbench.height=193
objectbench.width=2536
package.divider.horizontal=0.6
package.divider.vertical=0.847741935483871
package.editor.height=650
package.editor.width=1145
package.editor.x=410
package.editor.y=334
package.frame.height=875
package.frame.width=1296
package.divider.vertical=0.8480243161094225
package.editor.height=1109
package.editor.width=2425
package.editor.x=0
package.editor.y=0
package.frame.height=1416
package.frame.width=2576
package.numDependencies=2
package.numTargets=3
package.showExtends=true