StringTokenizer oder doch anders? Formelinterpretieren.

Status
Nicht offen für weitere Antworten.

A.T.

Bekanntes Mitglied
Hallo,
habe mal wieder ein Frage und weiß nicht so recht wie und wo ich anfangen soll. In C habe ich so was ähnliches schon mal geschrieben nur muss ich mir in Java wirklich wieder so einen Aufwand machen?

Also es geht darum das man eine Formel interpretieren kann. So was in der Art wie sin(x) * 15.6 + cos(8+x) oder auch ((2+8) * 9) +4.5.
Die Formel stet in einem String und müsste zerlegt werden. Habe mir gedacht mach das "einfach" mal mit dem Stringtokenizer aber dann habe ich hier im Forum gelesen das man den möglichst nicht mehr benutzen soll und selbst wenn habe ich das Problem das wenn ich z.B. Die Klammern als Trenner nehmen würde diese mir ja verloren gehen. Die brauche ich aber logischer weise für die weitere Betrachtung meiner Rechnung.

Das erste Beispiel müsste so was liefern wie das hier:
sin
(
x
)
*
15.6

cos
(
8
+
x
)

Gibt es in Java irgendein Hilfsmittel das mir dabei hilft den String in der Form zu zerlegen?

Danke schon mal für eure Anregungen!

Gruß A.T.
 

semi

Top Contributor
java.io.StreamTokenizer ist dafür gut geeignet.
Allerdings würde ich da einen "richtigen" Scanner/Lexer drumherum bauen,
da es bei arithmetischen Ausdrücken durchaus nötig sein kann einige
Tokens im Voraus zu lesen (Stichwort: Lookahead) bzw. zu klassifizieren.
z.B. bei "a+b*c" kannst du nicht einfach Operand(a), Operator(+), Operand(b)
holen und rechnen, da Multiplikation Vorrang hat.
Wie auch immer... Compiler-/Interpreterbau ist 'ne feine Sache. :wink:

Hier ein Beispiel wie der StreamTokenizer ungefähr funktioniert.
Code:
StreamTokenizer st = new StreamTokenizer(new StringReader("sin(x) * 15.6 + cos(8+x)"));
//st.slashSlashComments(true); 
//st.slashStarComments(true);
st.parseNumbers();
st.eolIsSignificant(false);
//st.lowerCaseMode(true);
//st.ordinaryChar('.');
//st.quoteChar('"');
//st.wordChars((int)'_', (int)'_');
      
for(;;)
{
  int token = st.nextToken();
  if(token == StreamTokenizer.TT_EOF)
    break;
  if(token == StreamTokenizer.TT_NUMBER)
    System.out.println(st.nval);
  else if(token == StreamTokenizer.TT_WORD)
    System.out.println(st.sval);
  else
    System.out.println((char)token); // Sonderzeichen, bzw. weder Number noch Word
}
 

A.T.

Bekanntes Mitglied
Ich will das ganze ja auch nicht sofort interpretieren sondern erst mal prüfen. Wie du geschrieben hast. Weil ich ja auch wissen muss ob die Klammerung richtig ist und so was. Wie gesagt habe schon mal einen Compiler geschrieben ist also im Prinzip klar wie es zu machen ist. Nur ob es in Java Hilfsmittel gibt de die arbeit etwas erleichtern leider im moment noch nicht.
Danke für den Hinweis. Werte mir java.io.StreamTokenizer mal angucken.
 

byte

Top Contributor
Warum nimmst Du nicht Regex? Damit fährste beim parsen von Strings eigentlich immernoch am besten.
 

Leroy42

Top Contributor
Reguläre Ausdrücke helfen ihm nicht viel weiter, da diese keine verschachtelten Klammernstrukturen
bearbeiten können; sie können einfach nicht zählen.

Semi's Vorschlag mit dem Lexer/Scanner ist so ziemlich die einzige Möglichkeit und auch ziemlich
einfach rekursiv zu implementieren, da diese Formeln, soweit ich mich richtig erinnere, einer einfachen
Typ 3 Grammatik entsprechen und man somit mit nur einem vorauszulesenden und zurückstellbaren
Token auskommt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J StringTokenizer - Trennzeichen nicht immer beachten Allgemeine Java-Themen 2
A Split, Scanner, StringTokenizer oder PatternMatching für flexibles Dateieinlesen? Allgemeine Java-Themen 2
C SUN-Box und StringTokenizer Allgemeine Java-Themen 2
M StringTokenizer überspringt leerfeld Allgemeine Java-Themen 10
M Stringtokenizer Allgemeine Java-Themen 2
T StringTokenizer Allgemeine Java-Themen 12
B SimpleDateFormat oder doch lieber GregorianCalendar Allgemeine Java-Themen 3
H Erste Schritte Java installiert oder doch nicht? Allgemeine Java-Themen 8
G Java Preferences API oder lieber doch nicht? Allgemeine Java-Themen 10
P Runnable Jar File über Windows ausführbar doch über Linux nicht Allgemeine Java-Themen 8
C Java Polling, Server Prozedur oder doch Datenbank? Allgemeine Java-Themen 4
G Observer / Observable oder doch lieber Message Broker? Allgemeine Java-Themen 2
A Primitive oder doch nicht? Allgemeine Java-Themen 11
ARadauer zuweisung ergibt doch true, oder? Allgemeine Java-Themen 17
spacegaier invokeLater wird doch immer ausgeführt, oder? Allgemeine Java-Themen 8
J Textdatei oder doch DB? Allgemeine Java-Themen 2
V String oder doch InputStream? Allgemeine Java-Themen 9
thE_29 Foxtrot doch nicht so super. Allgemeine Java-Themen 12
C Thread zu langsam ==> kann doch nicht sein oder? Allgemeine Java-Themen 9
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
E Anwendung verhält sich unter Mac anders als Unter Windows. Allgemeine Java-Themen 4
M liste von listen anders ausgeben Allgemeine Java-Themen 1
O RSA (JCE) anders als RSA in C ? Allgemeine Java-Themen 6
U Math.Random anders verteilen Allgemeine Java-Themen 4
X Websiten auslesen, Browser stellt Links anders da. Allgemeine Java-Themen 10
G experten gefragt? regx oder irgendwie anders . Allgemeine Java-Themen 3
reibi Klassenpfad mal anders - dynamisches Laden einer Klasse Allgemeine Java-Themen 7
L UnsatisfiedLinkError mal anders Allgemeine Java-Themen 4
A Warum verhält sich a+=b anders als a=a+b? Allgemeine Java-Themen 5
D gewisse Zeichen sind nach dem entschlüsseln anders Allgemeine Java-Themen 2
M ArrayIndexOutOfBounds! Wie gehts anders? Allgemeine Java-Themen 10
S ein taschenrechner, aber etwas anders. Allgemeine Java-Themen 2
8 Was ist denn jetzt anders? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben