diff --git a/GUI.form b/GUI.form
new file mode 100644
index 0000000..9f0969c
--- /dev/null
+++ b/GUI.form
@@ -0,0 +1,45 @@
+
+
diff --git a/GUI.java b/GUI.java
new file mode 100644
index 0000000..b278843
--- /dev/null
+++ b/GUI.java
@@ -0,0 +1,36 @@
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class GUI extends JFrame {
+ private JPanel panelMain;
+ private JTextField textFieldRechenterm;
+ private JLabel labelGibRechentermEin;
+ private JButton buttonBerechnen;
+ private JLabel labelErgebnis;
+
+ public GUI(String title){
+ super(title);
+
+ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ this.setContentPane(panelMain);
+ this.pack();
+ buttonBerechnen.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ //TODO: Text vom Text field zu Eingabe übergeben
+ Rechenmaschine rechner = new Rechenmaschine(textFieldRechenterm.getText());
+ labelErgebnis.setText("Das Ergebnis ist: "+rechner.getResult());
+ }
+ });
+ }
+
+ public static void main(String[] args) {
+ JFrame frame = new GUI("Rechenterme");
+ frame.setVisible(true);
+ }
+
+ private void createUIComponents() {
+ // TODO: place custom component creation code here
+ }
+}
diff --git a/Rechenmaschine.java b/Rechenmaschine.java
index 4488450..6e9a4f4 100644
--- a/Rechenmaschine.java
+++ b/Rechenmaschine.java
@@ -5,39 +5,30 @@ import java.text.DecimalFormat;
*/
public class Rechenmaschine {
- public static void main(String[] args) {
- new Rechenmaschine();
- }
-
private List tokenlist;
private String fehler;
- private double result;
+ private String result;
private int klammern;
- public Rechenmaschine() {
+ public Rechenmaschine(String eingabe) {
tokenlist = new List<>();
- Scanner input = new Scanner(System.in);
- System.out.println("Gib einen Term ein und bestätige mit ENTER: ");
- String eingabe = input.nextLine();
- input.close();
-
- if( !scanne(eingabe) ) {
+ if (!scanne(eingabe)) {
System.out.println("Fehler bei der lexikalischen Analyse:");
System.out.println(fehler);
return;
}
- if( !parse() ) {
+ if (!parse()) {
System.out.println("Fehler bei der syntaktischen Analyse:");
System.out.println(fehler);
return;
}
- if( !analyse() ) {
+ if (!analyse()) {
System.out.println("Fehler bei der semantischen Analyse:");
System.out.println(fehler);
return;
@@ -47,13 +38,14 @@ public class Rechenmaschine {
}
- public boolean scanne( String pEingabe ) {
+
+ public boolean scanne(String pEingabe) {
char[] eingabe = pEingabe.toCharArray();
klammern = 0;
int state = 0;
StringBuilder currentToken = new StringBuilder();
- for(char buchstabe: eingabe){
- switch(state){
+ for (char buchstabe : eingabe) {
+ switch (state) {
case 0:
switch (buchstabe) {
case '0' -> {
@@ -73,7 +65,7 @@ public class Rechenmaschine {
return false;
}
case '(' -> {
- tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe)));
+ tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe)));
state = 6;
klammern++;
}
@@ -89,7 +81,7 @@ public class Rechenmaschine {
break;
case 1:
switch (buchstabe) {
- case '0','1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
+ case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
System.out.println("Wenn eine 0 am anfang eines Operands ist, muss ein . folgen.");
return false;
}
@@ -104,9 +96,9 @@ public class Rechenmaschine {
state = 5;
}
case ')' -> {
- tokenlist.append(new Token("OPERAND",currentToken.toString()));
+ tokenlist.append(new Token("OPERAND", currentToken.toString()));
currentToken = new StringBuilder();
- tokenlist.append(new Token("PARANTHESES",")"));
+ tokenlist.append(new Token("PARANTHESES", ")"));
state = 7;
klammern--;
}
@@ -137,9 +129,9 @@ public class Rechenmaschine {
state = 5;
}
case ')' -> {
- tokenlist.append(new Token("OPERAND",currentToken.toString()));
+ tokenlist.append(new Token("OPERAND", currentToken.toString()));
currentToken = new StringBuilder();
- tokenlist.append(new Token("PARANTHESES",")"));
+ tokenlist.append(new Token("PARANTHESES", ")"));
state = 7;
klammern--;
}
@@ -182,9 +174,9 @@ public class Rechenmaschine {
return false;
}
case ')' -> {
- tokenlist.append(new Token("OPERAND",currentToken.toString()));
+ tokenlist.append(new Token("OPERAND", currentToken.toString()));
currentToken = new StringBuilder();
- tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe)));
+ tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe)));
state = 7;
klammern--;
}
@@ -217,7 +209,7 @@ public class Rechenmaschine {
return false;
}
case '(' -> {
- tokenlist.append(new Token("PARANTHESES","("));
+ tokenlist.append(new Token("PARANTHESES", "("));
state = 6;
klammern++;
}
@@ -232,7 +224,7 @@ public class Rechenmaschine {
}
break;
case 6:
- switch(buchstabe) {
+ switch (buchstabe) {
case '0' -> {
currentToken.append(buchstabe);
state = 1;
@@ -242,7 +234,7 @@ public class Rechenmaschine {
state = 2;
}
case '+', '-' -> {
- tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe)));
+ tokenlist.append(new Token("OPERATOR", Character.toString(buchstabe)));
state = 5;
}
case '*', '/' -> {
@@ -250,7 +242,7 @@ public class Rechenmaschine {
return false;
}
case '(' -> {
- tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe)));
+ tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe)));
klammern++;
}
default -> {
@@ -260,17 +252,17 @@ public class Rechenmaschine {
}
break;
case 7:
- switch(buchstabe) {
+ switch (buchstabe) {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '(' -> {
System.out.println("Nach ) muss ein Operator folgen");
return false;
}
case '+', '-', '*', '/' -> {
- tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe)));
+ tokenlist.append(new Token("OPERATOR", Character.toString(buchstabe)));
state = 5;
}
case ')' -> {
- tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe)));
+ tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe)));
klammern--;
}
default -> {
@@ -282,17 +274,17 @@ public class Rechenmaschine {
}
}
- if( state == 5 ) {
- fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem Operator enden!";
+ if (state == 5) {
+ fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit einem Operator enden!";
return false;
- } else if (state == 3){
- fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem . enden!";
+ } else if (state == 3) {
+ fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit einem . enden!";
return false;
- } else if (state ==6){
- fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit ( enden!";
+ } else if (state == 6) {
+ fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit ( enden!";
return false;
- } else if (klammern !=0){
- fehler = "Fehler im Wort " +pEingabe+ ":\nIm wort müssen alle Klammern geschlossen sein!";
+ } else if (klammern != 0) {
+ fehler = "Fehler im Wort " + pEingabe + ":\nIm wort müssen alle Klammern geschlossen sein!";
return false;
} else {
tokenlist.toLast();
@@ -313,62 +305,61 @@ public class Rechenmaschine {
int state = 0;
tokenlist.toFirst();
- while( tokenlist.hasAccess() ) {
+ while (tokenlist.hasAccess()) {
Token currentToken = tokenlist.getContent();
- switch( state ) {
+ switch (state) {
case 0:
- if( currentToken.getType().equals("OPERATOR") ) {
+ if (currentToken.getType().equals("OPERATOR")) {
fehler = "Rechenterm darf nicht mit einem Operator starten!";
return false;
- } else if( currentToken.getType().equals("OPERAND") ) {
+ } else if (currentToken.getType().equals("OPERAND")) {
state = 1;
break;
- } else if( currentToken.getToken().equals("(")){
+ } else if (currentToken.getToken().equals("(")) {
state = 2;
break;
- } else if( currentToken.getToken().equals(")")){
+ } else if (currentToken.getToken().equals(")")) {
state = 1;
break;
} else {
- fehler = "Unbekanntes Token: "+currentToken.getType();
+ fehler = "Unbekanntes Token: " + currentToken.getType();
return false;
}
-
case 1:
- if( currentToken.getType().equals("OPERATOR") ) {
+ if (currentToken.getType().equals("OPERATOR")) {
state = 0;
break;
- } else if( currentToken.getType().equals("OPERAND") ) {
+ } else if (currentToken.getType().equals("OPERAND")) {
fehler = "Auf einen Operanden darf kein Operand folgen!";
return false;
- } else if( currentToken.getToken().equals("(") ) {
+ } else if (currentToken.getToken().equals("(")) {
fehler = "Auf einen Operanden kann kein ( folgen";
return false;
- } else if( currentToken.getToken().equals(")")) {
+ } else if (currentToken.getToken().equals(")")) {
state = 1;
break;
} else {
- fehler = "Unbekanntes Token: "+currentToken.getType();
+ fehler = "Unbekanntes Token: " + currentToken.getType();
return false;
}
case 2:
- if( currentToken.getType().equals("OPERATOR") ) {
+ if (currentToken.getType().equals("OPERATOR")) {
state = 0;
break;
- } else if( currentToken.getType().equals("OPERAND") ) {
+ } else if (currentToken.getType().equals("OPERAND")) {
state = 1;
break;
- } else if( currentToken.getToken().equals("(")){
+ } else if (currentToken.getToken().equals("(")) {
state = 2;
break;
- } else if( currentToken.getToken().equals(")")){
+ } else if (currentToken.getToken().equals(")")) {
state = 1;
break;
} else {
- fehler = "Unbekanntes Token: "+currentToken.getType();
+ fehler = "Unbekanntes Token: " + currentToken.getType();
return false;
}
}
@@ -376,7 +367,7 @@ public class Rechenmaschine {
tokenlist.next();
}
- if( state == 0 ) {
+ if (state == 0) {
fehler = "Ein Rechenterm darf nicht auf einen Operator enden!";
return false;
} else {
@@ -386,10 +377,10 @@ public class Rechenmaschine {
public boolean analyse() {
tokenlist.toFirst();
- while(tokenlist.hasAccess()){
- if(tokenlist.getContent().getToken().equals("/")){
+ while (tokenlist.hasAccess()) {
+ if (tokenlist.getContent().getToken().equals("/")) {
tokenlist.next();
- if(tokenlist.getContent().getToken().equals("0")){
+ if (tokenlist.getContent().getToken().equals("0")) {
fehler = "Es kann nicht durch 0 geteilt werden.";
return false;
}
@@ -399,45 +390,45 @@ public class Rechenmaschine {
return true;
}
- private void punktVorStrich(ListpList){
+ private void punktVorStrich(List pList) {
pList.toFirst();
- while(pList.hasAccess()){
- if(pList.getContent().getToken().equals("*")){
+ while (pList.hasAccess()) {
+ if (pList.getContent().getToken().equals("*")) {
pList.remove();
Double faktor1 = Double.parseDouble(pList.getContent().getToken());
- pList.current=pList.getPrevious(pList.current);
+ pList.current = pList.getPrevious(pList.current);
Double faktor2 = Double.parseDouble(pList.getContent().getToken());
pList.remove();
- pList.getContent().setToken(String.valueOf(faktor2*faktor1));
- } else if(pList.getContent().getToken().equals("/")){
+ pList.getContent().setToken(String.valueOf(faktor2 * faktor1));
+ } else if (pList.getContent().getToken().equals("/")) {
pList.remove();
Double divisor = Double.parseDouble(pList.getContent().getToken());
//Previous Token muss gelöscht werden, tokenlist.getContent != null ist,
// wenn der 2. Token am ende des Termes ist.
- pList.current=pList.getPrevious(pList.current);
+ pList.current = pList.getPrevious(pList.current);
Double dividend = Double.parseDouble(pList.getContent().getToken());
pList.remove();
- pList.getContent().setToken(String.valueOf(dividend/divisor));
+ pList.getContent().setToken(String.valueOf(dividend / divisor));
}
pList.next();
}
}
- private void klammerRegel(ListpList){
- List newTokenlist= new List();
+ private void klammerRegel(List pList) {
+ List newTokenlist = new List();
pList.toFirst();
double berechnet;
//Durchlaufe die Tokenliste
- while(pList.hasAccess()){
+ while (pList.hasAccess()) {
// Token gleich ( dann entferne ihn
- if(pList.getContent().getToken().equals("(")) {
+ if (pList.getContent().getToken().equals("(")) {
pList.remove();
//anschließend durchlaufe solange, bis auf ) gestoßen wird
while (!pList.getContent().getToken().equals(")")) {
@@ -475,52 +466,52 @@ public class Rechenmaschine {
pList.next();
}
}
- private double mehrereKlammern(ListpList){
- List newTokenlist= new List();
- double berechnet=0;
- //wenn current ( ist
- if(pList.getContent().getToken().equals("(")){
- //wird es entfernt
- pList.remove();
- //anschließend wird die übergebene tokenliste solange durchlaufen, bis ) auftritt
- while(!pList.getContent().getToken().equals(")")){
+
+ private double mehrereKlammern(List pList) {
+ List newTokenlist = new List();
+ double berechnet = 0;
+ //wenn current ( ist
+ if (pList.getContent().getToken().equals("(")) {
+ //wird es entfernt
+ pList.remove();
+ //anschließend wird die übergebene tokenliste solange durchlaufen, bis ) auftritt
+ while (!pList.getContent().getToken().equals(")")) {
-
- if(pList.hasAccess()) {
- //wenn current ( ist dann wird diese methode nochmal ab current ausgeführt und anschließend
- // das ergebnis in newTokenlist eingefügt
- if (pList.getContent().getToken().equals("(") ) {
- berechnet = mehrereKlammern(pList);
- newTokenlist.append(new Token("OPERAND",String.valueOf(berechnet)));
- }
- // wenn current nich ) ist, dann wird es in newTokenlist gespeichert und aus der tokenliste entfernt
- if (!pList.getContent().getToken().equals(")")) {
- newTokenlist.append(pList.getContent());
- pList.remove();
- }
+ if (pList.hasAccess()) {
+ //wenn current ( ist dann wird diese methode nochmal ab current ausgeführt und anschließend
+ // das ergebnis in newTokenlist eingefügt
+ if (pList.getContent().getToken().equals("(")) {
+ berechnet = mehrereKlammern(pList);
+ newTokenlist.append(new Token("OPERAND", String.valueOf(berechnet)));
+ }
+ // wenn current nich ) ist, dann wird es in newTokenlist gespeichert und aus der tokenliste entfernt
+ if (!pList.getContent().getToken().equals(")")) {
+ newTokenlist.append(pList.getContent());
+ pList.remove();
}
}
- //wenn ) auftritt dann wird es entfernt und anschließend wird die berechnung von newTokenlist rückgegeben.
- pList.remove();
- berechnet = berechne(newTokenlist);
}
+ //wenn ) auftritt dann wird es entfernt und anschließend wird die berechnung von newTokenlist rückgegeben.
+ pList.remove();
+ berechnet = berechne(newTokenlist);
+ }
return berechnet;
}
- private double berechne(List pList){
+ private double berechne(List pList) {
double result1 = 0;
punktVorStrich(pList);
pList.toFirst();
- String previous="";
- while( pList.hasAccess() ) {
+ String previous = "";
+ while (pList.hasAccess()) {
Token currentToken = pList.getContent();
- if(currentToken.getType().equals("OPERATOR")){
- previous=currentToken.getToken();
+ if (currentToken.getType().equals("OPERATOR")) {
+ previous = currentToken.getToken();
}
- if( currentToken.getType().equals("OPERAND") ) {
+ if (currentToken.getType().equals("OPERAND")) {
switch (previous) {
case "+", "" -> result1 += Double.parseDouble(currentToken.getToken());
case "-" -> result1 -= Double.parseDouble(currentToken.getToken());
@@ -534,10 +525,13 @@ public class Rechenmaschine {
public void run() {
klammerRegel(tokenlist);
punktVorStrich(tokenlist);
- double result=berechne(tokenlist);
+ double result = berechne(tokenlist);
DecimalFormat format = new DecimalFormat("#,##0.####");
- String resultString=format.format(result);
- System.out.println("Ergebnis der Ausführung: " + resultString);
+ String resultString = format.format(result);
+ this.result= resultString;
}
-}
+ public String getResult() {
+ return result;
+ }
+}
\ No newline at end of file