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.
 
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
}
 
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.
 
Warum nimmst Du nicht Regex? Damit fährste beim parsen von Strings eigentlich immernoch am besten.
 
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.

Zurück
Oben