forked from IF-LK-2020/rechenmaschine
No.3,4
Implemented all Operators(+,-,*,/) ,Decimal Point, and a analysis for Division by zero.
This commit is contained in:
parent
5260cdb1f3
commit
f165368633
|
@ -13,7 +13,7 @@ public class Rechenmaschine {
|
|||
|
||||
private String fehler;
|
||||
|
||||
private int result;
|
||||
private double result;
|
||||
|
||||
public Rechenmaschine() {
|
||||
tokenlist = new List<>();
|
||||
|
@ -29,6 +29,12 @@ public class Rechenmaschine {
|
|||
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:");
|
||||
System.out.println(fehler);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,6 +233,29 @@ public class Rechenmaschine {
|
|||
}
|
||||
}
|
||||
|
||||
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() {
|
||||
|
||||
int state = 0;
|
||||
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue