FunktionsParser schreiben

das-mo

Mitglied
Hi,
Ich programmiere mit einem Freund in der Schule zusammen einen Funktionsplotter und mein Ziel ist es dabei auch gleich einen schönen Parser mit einzubauen. Ich habe mich schon ein bisschen durchs WWW gelesen und hab auch bisschen Lektüre (Compiler-Bau Teil1,2). Ich habe nur ein kleines Problem.
Ich weiß einfach nicht wie und wo ich anfangen soll. Ja also ich habe die Funktion an sich, bzw. das anch dem f(x)= und das muss ich aufsplitten. Ich denke auch das es sinnvoll ist die einzelnen Ausdrücke mit dem jeweiligen Vorzeichen einzeln zu "speichern" und dann aufzulösen, da ich evtl. noch die Ableitung berechnen möchte und das geht mit Kntoten ja schlecht (?oder?). So ich denke dieses erste Aufsplitten ist mit einer Schleife und 2-3 abfragen schnell geschrieben. Nur wie mache ich dann am besten weiter. "Speicher" ich die Ausdrücke jeweils in einzelnen Obejkten einer eigenen Klasse? Und wie gehe ich am besten mit potenzen und sin,cos,sprt .... um ?

Gruß das-mo
 

kirax

Bekanntes Mitglied
Es macht auf jeden Fall Sinn, die Ausdrücke zu trennen und getrennt zu speichern.
Spontan würde mir eine Baumstruktur in den Sinn kommen, damit kannst du gleich die Hierarchie bei den Rechenregeln abbilden. Z.B.

(5+4)*3^2

wird ca. zu

Code:
[*]------+
 |       |
[^]-+  [( )]
 |  |    |
 3  2   [+]--+
         |   |
         5   4

Und das kannst du dann von (links) unten nach oben durcharbeiten.
 

das-mo

Mitglied
Ok Danke.
So in etwa mit einer Baumstruktur hab ich mir das auch gedacht nur da hab ich jetzt ne Frage.
Setz ich vor dem Parsen einen Wert für x ein oder lös ich die funktion erst auf und setze dann ein?
 

das-mo

Mitglied
Aber wie speicher ich denn jede einzelne zahl und jeden operator etc. ab, sodass ich das am ende noch ausrechnen und evtl ableiten kann?
 

Antoras

Top Contributor
Schau dir mal die beiden Tutorials hier an: Interpreterbau - Ein Anfang und Compilerbau
Beide beschreiben den Aufbau eines Recursive Descent Parsers (RDP) und geben einen kleinen Einblick in die Materie. Der Code ist zwar in C++ verfasst aber gut mit Text erklärt - es sollte also kein Problem sein zu verstehen wie vorgegangen wird, auch wenn du kein C++ kannst.

Ich hab in Java auch mal eine Implementierung eines kleinen Matheparsers geschrieben, der Funktionen und Konstanten erkennen kann (ebenfalls auf Basis eines RDP). Wenn du willst kann ich den Code posten.
 

das-mo

Mitglied
Das mit dem Code wäre nett, weil mein größtes Problem liegt, wen ich mal so weiter drüber nachdenke, wie ich denn letztendlich die einzelnen erkannten Teile(Ausdrücke, operatoren, Potenzen,...) abspeicher und nacher zusammenfüge. Aber Danke auch für die links, werd mich da mal bisschen umgucken.
 

Antoras

Top Contributor
weil mein größtes Problem liegt, wen ich mal so weiter drüber nachdenke, wie ich denn letztendlich die einzelnen erkannten Teile(Ausdrücke, operatoren, Potenzen,...) abspeicher und nacher zusammenfüge
In einem Parsebaum. Aber das Prinzip ist in den Tutorials beschrieben.

Der Java-Code ist nicht dokumentiert, funktioniert aber auch nach dem RDP-Prinzip. Mehr dazu erklärt dir Wikipedia oder die Tutorials. Testen kannst du den Code z.B. damit:

Java:
import de.interpreter.ScriptEngine;

public class InterpreterTest {

	public static void main(final String... args) throws IOException {
		final String s1 = "(10+5)-3*(2-(10/5)*+2)-100-((((-100)+1)+1)+1)*(40-2)+((((-100)+1)+1)+1)-(10+5)-3*(2-(10/5)*2)-100-((((-100)+1)+1)+1)*(40-2)+((((-100)+1)+1)+1)";
		final String s2 = "11+max(5,6)+min(2,max(4,11))*2";
		final String s3 = "def hello() { 50 + 3 }";
		final String s4 = "min(4,9,13,1,84)";
		final String s5 = "2*3)";
		final String s6 = "uga()";
		
		final ScriptEngine se = new ScriptEngine();
		System.out.println(se.parse(s1).eval()); // 6990
		System.out.println(se.parse(s2).eval()); // 21
		System.out.println(se.parse(s3).eval()); // 53
		System.out.println(se.parse(s4).eval()); // 1
		try {System.out.println(se.parse(s5).eval()); } catch (final Exception e) { e.printStackTrace(); }
		try {System.out.println(se.parse(s6).eval()); } catch (final Exception e) { e.printStackTrace(); }
	}
}
Wichtig sind eigentlich bloß die parse- und eval-Methoden. Eine EBNF nach der der Code vorgeht liegt bei.
 

Anhänge

  • parser.zip
    17,2 KB · Aufrufe: 18

Antoras

Top Contributor
> Womit hast du das geschrieben
Mit meiner IDE?
> ich find mich in dem Ordner nicht zurecht
Alles unterhalb von src sind die Sourcen, dann gibt es noch die EBNF und sonst ist da nichts. Wie du die Sourcen ausführst musst du schon selbst wissen. Am einfachsten ist es wohl die von deiner IDE zu importieren und dann mit dem Testcode, den ich oben gepostet habe, auszuführen.
 

das-mo

Mitglied
Bisschen rumgespielt und habs dann irgndwann reinbekommen.

Ich habe eine kleine Frage nebenbei:
Wie erstelle ich eine generische Arraylist? Ich habe die Klasse Token und möchte dort immer die gescannten Token vermerken. Ich krieg nur immer eine Fehlermeldung bei der Erstellung der Arraylist zurück:
Java:
  ArrayList<Token> obj_token = new ArrayList<Token>();
ERR: <bezeichner> erwartet
 

das-mo

Mitglied
Das ist eine Klasse im selben Package, die muss ich doch garnicht importieren!?

EDIT: Hab es trotzdem mal importiert, hat sich aber nichts geändert.
 
Zuletzt bearbeitet:

das-mo

Mitglied
Klasse Token:
Java:
package Parser;

public class Token
{
  private int int_start;
  private int int_end;

  private int int_type;
  /*
   0 = Zahl
   1 = +, 2 = -, 3 = *, 4 = /
   5 = Bereich von Klammer umschlossen; auch potenzen, sin, sqrt, ...
   */

  private int int_spc;
  /*
    0 = normale Klammer
    1 = sqrt
    2 = sin, 3 = cos, 4 = tan, 5 =cot
   */


  //Konstruktoren
  public Token () {}

  public Token (int type, int pos)
  {
    int_type = type;
    int_start = pos;
  }

  public Token (int type, int pos1, int pos2)
  {
    int_type = type;
    int_start = pos1;
    int_end = pos2;

    if (type == 5)
    {
      int_spc = 0;
    }
  }

  public Token (int type, int spc, int pos1, int pos2)
  {
    int_type = type;
    int_spc = spc;
    int_start = pos1;
    int_end = pos2;
  }

  //Methoden zum Setzen/Erhalten von Eigenschaften/Variablen
  public void setStart (int pos)
  {
    int_start = pos;
  }

  public void setEnd (int pos)
  {
    int_end = pos;
  }

  public void setType (int type)
  {
    int_type = type;
  }

  public void setSpc (int spc)
  {
    int_spc = spc;
  }

  public int getStart ()
  {
    return int_start;
  }

  public int getEnd ()
  {
    return int_end;
  }

  public int getType ()
  {
    return int_type;
  }

  public int getSpc ()
  {
    return int_spc;
  }
}

Klasse vom Scanner:
Java:
package Parser;
import java.util.*;

public class Scanner
{
  private String String_fkt;
  private int int_pos;
  private boolean error;
  ArrayList<Token> obj_token = new ArrayList<Token>();

  //Konstruktoren
  public Scanner () {}
  public Scanner (String fkt)
  {
    String_fkt = fkt;
  }

  //Methoden zum Setzen von Eigenschaften/Variablen
  public void setFunction (String fkt)
  {
    String_fkt = fkt;
  }
 

Antoras

Top Contributor
Der Code ist korrekt, entweder ist dein Compiler kaputt oder du hast sonst noch irgendwo einen Fehler. Ist das der komplette Code? Wie sieht die genaue Fehlermeldung aus?

Im übrigen schreibt man Variablennamen in Java in "lowerCamelCase" und trennt sie nicht mit Unterstrichen. Und packages sind nur "lowercase".
 

das-mo

Mitglied
ja ok package war nen versehen, aber was ist ist denn bitte lowercamelcase^^

EDIT: oben steht die vollständige Fehlermeldung: <bezeichner> erwartet in Zeile 9
 
Zuletzt bearbeitet:

das-mo

Mitglied
Ähhh ich benutze den JBuilder 9 ^^

EDIT: Hat das vlt. damit was zu tun, dass der JBuilder die JDK 1.4.1 am laufen hat?
EDIT: Hab jetzt die JDK 1.6 drauf und immernoch der selbe Fehler
 
Zuletzt bearbeitet:

Antoras

Top Contributor
Hast du beim JBuilder auch eingestellt, dass mit dem neuesten JDK kompiliert werden soll? Wie das geht weiß ich nicht, das kannst du in den Optionen der IDE aber bestimmt einstellen.
 
G

Gast2

Gast
Du kannst die ArrayList ohne Generics verwenden, evtl. schluckter das dann.
Ich würde allerdings mal Java und die IDE neu aufsetzen bei dir.
 

das-mo

Mitglied
JBuilder kann ich leider nicht neu aufsetzen, ist ne schullizenz und ich hab die aktivierungsdatei nicht mehr^^, aber ich installier mir gerade netbeans

EDIT: Tadaaaa Netbeans nimmt es an
 
Zuletzt bearbeitet:

das-mo

Mitglied
Ich hätte da nochmal ne kleine Frage:
Kommen sich Switch und Schleifen eig in die Quere wenn ich break anwende?
Java:
switch (blabla)
{
case 1:
   while(blabla)
   {
     if(blabla)
        {
          break;
        }
   }
}
Stoppt das break; jetzt die Schleife oder das switch?
 

eRaaaa

Top Contributor
Wie wäre es denn wenn du es einfach ausprobierst?
Java:
	public static void main(String[] args) throws Exception {
		int i = 1;
		switch (i) {
		case 1:
			while (true) {
				if (true) {
					break;
				}
			}
			//break;   //<----------------
		case 2:
			System.out.println("Durchfall?");
		}
	}
 

das-mo

Mitglied
So ich bin nochmal da :)

Wie kann ich machen, das alle Klassen mit ein und dem selben Objekt arbeiten?
z.B. ich hab die ArrayList<Token> und würd gerne, dass mehrere Klassen, ohne dass das Objekt immer wieder neu übergeben werden muss, damit arbeiten können.

Gruß das-mo
 

eRaaaa

Top Contributor
Was gefällt dir denn am Übergeben nicht? Wenns dir zu umständlich wird nimm ein Dependency-Injection Framework zur Hand :) Das ist aber eig. die gängige Art...
ansonsten wäre eine alternative Antwort auf deine Frage: statte das Feld mit dem entsprechenden Zugriffsmodifier aus und statisch :)
 

das-mo

Mitglied
wenn ich denn möchte, dass man nur innerhalb dieses packages drauf zugreifen kann muss ich dann schreiben:
protected static ArrayList<Token> ??
Und wenn es static ist kann ichh es dann noch großartig ändern?
 

eRaaaa

Top Contributor
wenn ich denn möchte, dass man nur innerhalb dieses packages drauf zugreifen kann muss ich dann schreiben:
protected static ArrayList<Token> ??

Äh nein nicht ganz, nur package = kein Modifier :) --> http://www.java-forum.org/blogs/eraaaa/98-java-modifier.html
protected ist noch ein Stück offener :p
Und wenn es static ist kann ichh es dann noch großartig ändern?

?! --> http://www.java-forum.org/stichwort-static/1353-bedeutet-static.html
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
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
M Binäre Datei schreiben und lesen Allgemeine Java-Themen 4
T Properties Datei nicht jedes mal neu schreiben? Allgemeine Java-Themen 2
H excel einlesen und in db schreiben Allgemeine Java-Themen 2
cedi int Zahl in ein ASCII zeichen umwandeln und dieses in ein externes Textfenster schreiben Allgemeine Java-Themen 6
kirchrath PCM als WAV schreiben bzw ogg-Vorbis zu WAV Allgemeine Java-Themen 2
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
A Eigenen OutputStream schreiben und verwenden Allgemeine Java-Themen 9
D zip Dateien schreiben mit in/outputstream Allgemeine Java-Themen 10
Beckenbauer Mehrere Paragraphe in eine Word Datei schreiben Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben