tipps zum schreiben eines mathematischen parser

Status
Nicht offen für weitere Antworten.

biker126

Bekanntes Mitglied
hallöchen

kennt jemand gut tutorials oder beispiel code in java zum schreiben eines parsers der mir einen string in mathematische ausdrücke umwandelt bzw. ausrechnet.

also sowas: "(1+((((2+3)*5)/6)*7))" oder auch sowas "5^3/3+cos(0.5)"

ich hab mir bishher folgendes überlegt, ich les die operanden (zahlen) in einen stack ein und die operatoren (+,*,- usw) in n anderen stack. wenn eine öffnende klammer kommt ruf ich meinen parser rekursiv auf und teste dann weiter. wenn n schliessende klammer kommt nehm ich die 2 obersten werte ausm operanden-stack und rechne die mit dem obersten wert ausm operatoren-stack aus. dann schreib ich das ergebnis zurück auf den operandenstack und geh ne rekursionsstufe nach oben...

aber irgendwie klappts noch ned. vor allem muss ich ja falls keine klammer kommt im string immer um einen index weiterlaufen. aber da gibts mir dann ne endlos-schleife (siehe code)

Code:
    private void parseAndDetermine(String s, int i) {
        while (i < s.length()) {
            if (s.charAt(i) == '(') parseAndDetermine(s, ++i);
            // ausrechnen bei schliessender klammer
            if (s.charAt(i) == ')') {
                // operator aus operator-stack holen
                String s_operator = (String) operators.pull();
                // basic-operatoren sind: +,-,*,/,^
                if (isBasic(s_operator)) {
                    // die obersten beiden werte holen
                    Double D_b = (Double) operanden.pull();
                    Double D_a = (Double) operanden.pull();
                    // und
                    // ausrechnen
                    Double D_result = determineBasic(s_operator, D_a, D_b);
                    // resultat
                    // zurück
                    // auf
                    // stack
                    operanden.push(D_result);
                }
                // der rest: sin,
                // cos, tan, exp
                // usw.
                else {
                    Double D_a = (Double) operanden.pull();
                    Double D_result = determineAdvanced(s_operator, D_a);
                    operanden.push(D_result);
                }
                // ne stufe nach
                // oben
                return;
            }
            if (s.charAt(i) == 'x') {
                operanden.push(new Double(actX));
                i++;
            }
            // zahlen in den operanden stack
            if (s.charAt(i) >= 0 && s.charAt(i) <= 9) {
                operanden
                        .push(new Double(Double.parseDouble(s.substring(i, i))));
                i++;
            }
            // jetzt alle operatoren: in den
            // operatoren-stack
            if (s.charAt(i) == '+') {
                operators.push(new String("+"));
                i++;
            }
            if (s.charAt(i) == '-') {
                operators.push(new String("-"));
                i++;
            }
            if (s.charAt(i) == '*') {
                operators.push(new String("*"));
                i++;
            }
            if (s.charAt(i) == '/') {
                operators.push(new String("/"));
                i++;
            }
            if (s.charAt(i) == '^') {
                operators.push(new String("^"));
                i++;
            }
            if (s.charAt(i) == 'l') {
                operators.push(new String("ln"));
                i++;
            }
            if (s.charAt(i) == 'e') {
                if (s.regionMatches(true, i, "exp", 0, 3))
                    operators.push(new String("exp"));
                else
                    operanden.push(new Double(Math.E));
                i++;
            }
            if (s.charAt(i) == 's') {
                if (s.regionMatches(true, i, "sin", 0, 3))
                    operators.push(new String("sin"));
                else
                    operators.push(new String("sqrt"));
                i++;
            }
            if (s.charAt(i) == 'c') {
                operators.push(new String("cos"));
                i++;
            }
            if (s.charAt(i) == 't') {
                operators.push(new String("tan"));
                i++;
            }
            if (s.charAt(i) == 'a') {
                if (s.regionMatches(true, i, "asin", 0, 4))
                        operators.push(new String("asin"));
                if (s.regionMatches(true, i, "acos", 0, 4))
                        operators.push(new String("acos"));
                if (s.regionMatches(true, i, "atan", 0, 4))
                        operators.push(new String("atan"));
                i++;
            }
            System.out.println("i= " + i);
            operators.showStack();
            operanden.showStack();
        }
    }

    private boolean isBasic(String s) {
        if (s.equals("+"))
            return true;
        else if (s.equals("-"))
            return true;
        else if (s.equals("*"))
            return true;
        else if (s.equals("/"))
            return true;
        else
            return false;
    }

    private Double determineBasic(String s, Double a, Double b) {
        double d_a = a.doubleValue();
        double d_b = b.doubleValue();
        double d_result = 0;
        Double result;
        if (s.equals("+")) d_result = d_a + d_b;
        if (s.equals("-")) d_result = d_a - d_b;
        if (s.equals("*")) d_result = d_a * d_b;
        if (s.equals("/")) d_result = d_a / d_b;
        if (s.equals("^")) d_result = Math.pow(d_a, d_b);
        return result = new Double(d_result);
    }

    private Double determineAdvanced(String s, Double a) {
        double d_result = 0;
        double d_a = a.doubleValue();
        Double result;
        if (s.equals("sin")) d_result = Math.sin(d_a);
        if (s.equals("cos")) d_result = Math.cos(d_a);
        if (s.equals("tan")) d_result = Math.tan(d_a);
        if (s.equals("asin")) d_result = Math.asin(d_a);
        if (s.equals("acos")) d_result = Math.acos(d_a);
        if (s.equals("atan")) d_result = Math.atan(d_a);
        if (s.equals("exp")) d_result = Math.exp(d_a);
        if (s.equals("ln")) d_result = Math.log(d_a);
        if (s.equals("sqrt")) d_result = Math.sqrt(d_a);
        return result = new Double(d_result);
    }

Code:
import java.util.Vector;
public class Stack 
{
	private Vector stack;
	public Stack(int size)
	{
		stack = new Vector(size);
	}
	
	public void push(Object obj)
	{
		stack.insertElementAt(obj, 0);
	}
	public Object pull()
	{
		Object obj;
		obj = stack.elementAt(0);
		stack.remove(0);
		return obj;
	}
	public void showStack()
	{
		for (int i=0; i<stack.size(); i++)
		{
			System.out.println("|"+(String)stack.elementAt(i)+"|");
		}
		System.out.println("____");
	}
	public boolean isEmpty()
	{
		return stack.isEmpty();
	}
}


also... wenn mir jmd n tipp zu meinem code geben könnte oder n allgemeinen lösungsvorschlag oder eben ein tutorial wär ich echt froh drum! ;)
 

Manfred

Bekanntes Mitglied
Hi!

Tolle Sachen die du da gemacht hast.

Leider kann ich jedoch diesen Funktionsplotter bzw. auch diesen FightSim nicht starten, Fehlermeldung "Fatal exeption occured" kommt!

Wenn ich das JAR File öffne, bekomme ich die Meldung, dass die Main Klasse z.B. multigraph2.main ist, diese ist jedoch gar nicht vorhanden!? Bzw .main File???
 
B

Beni

Gast
Die Bibliothek hast du runtergeladen und installiert? Das ist der oberste Eintrag, ebenfalls ein jar. Wenn du diese Jar ausührst, werden ein paar Dateien verschoben, damit die anderen Progs laufen.

Interessiert mich sehr, ob das bei dir funktioniert (bei mir funzt jedenfalls, aber ich hab auch nur einen PC zum testen).

mfg Beni
 

biker126

Bekanntes Mitglied
@beni: bist auch an der eth? (sieht zumindest so aus :)).

ich bin im 4. semester elektrotechnik :). werd mir deinen parser mal zu gemüte führen. danke schonmal!
 
B

Beni

Gast
Bin ich tatsächlich :bae:

Erst im 2. Semester, aber in der Informatik 8)
 

biker126

Bekanntes Mitglied
kewl :)

aber ich hab schon wieder das nächste problem. ich kann deine bibliothek ned installieren... hab per doppelklick auf die jar-datei so'n installer gestartet und da auf start gedrückt. hab auch extra n paar minuten gewartet (so ca. 10 :D). is aber nix passiert... ich nehm mal an es sollte irgendwann ne meldung kommen dass er fertig ist mit installieren oder?
irgendne idee warums ned geht bzw. kann ich deine bibliothek noch anders installieren?
 
B

Beni

Gast
Irgendwie sollte ein Dialog mit einer ProgressBar kommen...
Kannst du den Installer nicht mal aus einer Konsole starten? Vielleicht gibts eine interessante Fehlermeldung.

Aber ja, das geht auch anders: das jar entpacken und die Datei "bibliothek.jar" in den ext-Ordner der JRE schreiben: siehe unten
 

biker126

Bekanntes Mitglied
wie starte ich denn eine jar-datei aus der konsole? kenn mich mit jars überhaupt rein gar nicht aus... :(
 

Illuvatar

Top Contributor
Du wechselst (unter Windows) mit dem Befehl
Code:
cd Verzeichnis
in das Verzeichnis, in dem die jar-Datei liegt.
Dann startest du
Code:
java -jar xyz.jar
bzw. wenn der PATH nicht gesetzt ist
Code:
C:\jdk14\bin\java.exe -jar xyz.jar (Das JDK-Installationsverzeichnis)
 

biker126

Bekanntes Mitglied
Code:
java.lang.NullPointerException
        at java.awt.Dimension.<init>(Dimension.java:91)
        at javax.swing.plaf.basic.BasicProgressBarUI.getPreferredSize(BasicProgr
essBarUI.java:799)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1275)
        at java.awt.GridBagLayout.GetLayoutInfo(GridBagLayout.java:892)
        at java.awt.GridBagLayout.getLayoutInfo(GridBagLayout.java:806)
        at java.awt.GridBagLayout.preferredLayoutSize(GridBagLayout.java:630)
        at java.awt.Container.preferredSize(Container.java:1178)
        at java.awt.Container.getPreferredSize(Container.java:1162)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1277)
        at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:8
20)
        at java.awt.Container.preferredSize(Container.java:1178)
        at java.awt.Container.getPreferredSize(Container.java:1162)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1277)
        at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:572)
        at java.awt.Container.preferredSize(Container.java:1178)
        at java.awt.Container.getPreferredSize(Container.java:1162)
        at java.awt.Window.pack(Window.java:438)
        at binstaller.WaitDialog.<init>(WaitDialog.java:36)
        at binstaller.InstallDialog.install(InstallDialog.java:232)
        at binstaller.InstallDialog.access$16(InstallDialog.java:14)
        at binstaller.InstallDialog$Listener.actionPerformed(InstallDialog.java:
823)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:17
86)
        at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Abstra
ctButton.java:1839)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:245)
        at java.awt.Component.processMouseEvent(Component.java:5100)
        at java.awt.Component.processEvent(Component.java:4897)
        at java.awt.Container.processEvent(Container.java:1569)
        at java.awt.Component.dispatchEventImpl(Component.java:3615)
        at java.awt.Container.dispatchEventImpl(Container.java:1627)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
        at java.awt.Container.dispatchEventImpl(Container.java:1613)
        at java.awt.Window.dispatchEventImpl(Window.java:1606)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

        at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

--> nullpointerexception, ich hoff du wirst daraus schlauer als ich @beni ;). so wie das seh hats wohl was mit dem LookAndFeel zu tun. ich werd mal testen obs mit dem standard silver xp-style geht. weil ich hab ja einen sehr eigenen style (scrollbar hab ich zb. wieder keine gesehn. aber eigentlich sollte das prog dadurch doch ned abstürzen oder?)

EDIT:
mit dem silver xp-style klappts. aber find ich irgendwie komisch, dass ein ganzes programm nur wegen dem LookAndFeel ned geht. ich mein, wenn's nur komisch aussieht... das wär ja verständlich und ned weiter schlimm. aber das gleich das ganze prog abstürzt???
 
B

Beni

Gast
Naja, ein Look and Fell zu schreiben ist eine schwierige Sache. Da kann schon mal der eine oder andere Bug entstehen.
Und dann wird die Exception von einer Methode zur nächsten gereicht...

Was benutzt du denn für einen komischen Style?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
DaCrazyJavaExpert OOP Ansätze und Tipps zum Porgrammieren eines Taschenrechners Allgemeine Java-Themen 25
C Mouse Bereiche - Besser notieren - Tipps Allgemeine Java-Themen 2
F Message Queue Tipps Allgemeine Java-Themen 3
S Suche Tipps für Einstieg in JavaCC Allgemeine Java-Themen 2
G Exception handling - b.practices/tipps. etc. Allgemeine Java-Themen 3
T Autostart Programm - brauche Tipps Allgemeine Java-Themen 5
S Tipps: java richtig lernen - wie? Allgemeine Java-Themen 3
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
curranux Ausgabe als Textdatei schreiben. Allgemeine Java-Themen 2
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
H In jar Resources schreiben? Allgemeine Java-Themen 6
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
L Erste Schritte Ausdruck schöner schreiben? Allgemeine Java-Themen 8
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
ralfb1105 Blöcke aus Datei filtern/suchen und in neue Datei schreiben Allgemeine Java-Themen 10
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
M In Textdatei schreiben Allgemeine Java-Themen 3
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
Aruetiise " in Datei schreiben Allgemeine Java-Themen 2
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
K Zusammenfassungen schreiben Allgemeine Java-Themen 2
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
KeVoZ_ Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben Allgemeine Java-Themen 6
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
M Makrocode von OO in Java schreiben Allgemeine Java-Themen 5
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
F Lesen effizienter als schreiben? Allgemeine Java-Themen 4
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
M Input/Output Datei Schreiben Allgemeine Java-Themen 3
V Eclipse Ich kann bei eclipse nicht schreiben Allgemeine Java-Themen 1
Tobse HTTP REST API's in SQL schreiben Allgemeine Java-Themen 1
B Übergebene Werte in Gerätedatei schreiben Allgemeine Java-Themen 2
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
M Methoden jRegistryKey und in die Regitrey schreiben Allgemeine Java-Themen 5
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
F Linux & NetBeans: Datei in Systemverzeichnis schreiben? Allgemeine Java-Themen 1
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
E wav Datei schreiben mit AudioInputStream Allgemeine Java-Themen 3
T Excel - mit jxf sprachabhängige Formeln schreiben Allgemeine Java-Themen 2
S Java-Programm für "Börsenanalyse" schreiben Allgemeine Java-Themen 4
W Schreiben/Lesen aus RS232 / jssc Allgemeine Java-Themen 0
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
L Input/Output Datei einlesen und Inhalt in Array schreiben Allgemeine Java-Themen 3
D Datei in Jar schreiben Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
O Entwicklungshandbuch schreiben Allgemeine Java-Themen 2
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
O Collections StringSplit und in anderen String schreiben Allgemeine Java-Themen 8
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
M Symmetrischen "KeyGenerator" schreiben Allgemeine Java-Themen 2
B Großes Projekt "gut" schreiben Allgemeine Java-Themen 22
F Sachen in datei schreiben Allgemeine Java-Themen 2
G Binäre Datei lesen / schreiben Allgemeine Java-Themen 9
M ImageJ: Mit PlugIn Weichzeichnungsfilter schreiben Allgemeine Java-Themen 9
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
A DOM Datei schreiben Allgemeine Java-Themen 3
F In ein Textfeld im Browser schreiben? Allgemeine Java-Themen 4
Chumax Datei als Admin schreiben Allgemeine Java-Themen 5
S Von einer ArrayList in die andere schreiben? Allgemeine Java-Themen 6
I Eigenes Mail-Programm schreiben Allgemeine Java-Themen 21
S eigene regEx schreiben Allgemeine Java-Themen 4
E Performanceverlust beim Schreiben von ResultSet in txt Datei Allgemeine Java-Themen 10
F In mitten einer Textdatei schreiben Allgemeine Java-Themen 7
B Java Plugin schreiben Allgemeine Java-Themen 11
R Datei zeilenweise lesen und schreiben Allgemeine Java-Themen 6
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
S Runtime Exceptions in eine Datei schreiben Allgemeine Java-Themen 7
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
I kleines Wochenlohn-Programm schreiben Allgemeine Java-Themen 5
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
C Eigene Sounddateien schreiben Allgemeine Java-Themen 12
das-mo FunktionsParser schreiben Allgemeine Java-Themen 32
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
J HSSF - schreiben in und lesen aus vorhandener Datei Allgemeine Java-Themen 6
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
C Property-File lesen und schreiben Allgemeine Java-Themen 20

Ähnliche Java Themen

Neue Themen


Oben