# Auswertung arithmetischer Ausdrücke mit SAX und Java



## mbg (11. Jun 2005)

Hallo,

ich habe folgendes Problem. Wir sollen eine XML-Datei mit SAX Parsen und die arithmetischen Ausdrücke in polnischer
Notation ( z.b. +(1,-(3,1)) ) auswerten. eine XML-Datei wäre z.b. :

```
<?xml version="1.0" encoding="UTF-8"?>
<Expr xmlns="http://www-mmt.inf.tu-dresden.de/expr"
xmlns:mpeg7="http://www.mpeg7.org/2001/MPEG-7_Schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www-mmt.inf.tu-dresden.de/expr arithm_expr.xsd">
	<Term type="+">
		<Term type="-">
			<Const>3</Const>
			<Const>4</Const>
		</Term>
		<Term type="-">
			<Const>3</Const>
			<Term type="-">
				<Const>3</Const>
				<Const>4</Const>
			</Term>
		</Term>
	</Term>
</Expr>
```

Habe mir jetzt ein Programm geschrieben das beim Parsen eine Liste der Form [+, (, -, (, 3, 4, ), -, (, 3, -, (, 3, 4, ), ), )]   erzeugt (bezogen auf obige XML-Datei).
Hab mir auch eine String erzeugt: add(sub(3,4),sub(3,sub(3,4))).

Und jetzt meine Frage kann ich den String benutzen um das Ergebnis auszurechen ( a la int erg = add(1,sub(..)) , wenn add und sub als Funktionen bekannt sind),
oder ist die Liste hilfreicher, oder kann ich den Wert trotz der möglichen Verschachtelungen direkt beim Parsen berechnen?

thx, mbg.


----------



## Bleiglanz (12. Jun 2005)

machs direkt bei parsen,

die datei ist ja schon richtig aufgebaut

bei StartElement eines Terms

  legst du + oder - auf einen "Stapel"

bei StartElement einer Const

   legst du das auf den Stapel

   wenn schon vorher ein Const da war, dann war vorvorher ein Term

    jetzt nimmst du die letzten drei und berechnest das zwischenergebnis

    und legst nur das auf den Stapel usw. usf


ist doch gut geeignet für SAX, wozu das erst in eine Liste verwandeln.?


----------



## mbg (12. Jun 2005)

Wenn ich das auf diese Weise mache wird das ganze auch extrem kompliziert, sobald mal sowas wie +(-(2,+(3,4))) auftaucht


----------



## Bleiglanz (12. Jun 2005)

ja und?

alles in einen Liste oder String packen und dann NOCHMAL durchlaufen ist auch nicht besser

kompliziert ist da gar nichts, denn wenn + 3 4 daherkommt
startelement +  lege + als operator auf den stack
startelement 3   lege 3 als konst auf den stack
startelement 4   lege 4 als konst auf den stack
endelement + 

HOPPLA, jetzt kann ich ja sofort auswerten (wenn zwei konst nach einem operator!)

nimm 3 vom stack
nimm 4 vom stack
nimm + vom stack

lege 7 auf den stack

....


auf die art und weise wird ja alles "sofort berechnet", wenn du so arbeitest, dann wird bei
den endElement Events alles von unten nach oben "aufgelöst"


----------



## Bleiglanz (12. Jun 2005)

Klammern hast du ja nicht im xml
+(-(2,+(3,4))) 


start +   => + auf den stack
start -    => - auf den stack
start 2    => 2 auf den stack
start +    => + auf den stack
start 3     => 3 auf den stack
start 4     => 4 auf den stack
ende +    => berechne summe der beiden obersten und ersetze alle nötigen

der stack sollte jetzt so ausschauen

7
2
-

jetzt kommt EndElement -

dann genauso...


----------



## mbg (12. Jun 2005)

@Bleiglanz: Thx,

scheint zu funktionieren. Eine kurze Frage noch:
welchen Datentyp würdest du mir für den Stack empfehlen?

mfg, mbg.


----------



## Bleiglanz (12. Jun 2005)

puuu

etwas kompliziert, weil du "Operationen" und "Konstanten" rauflegen willst

am einfachsten als String...

ansonsten ein gemeinsames Interface definieren, "AtomarerAusdruck" mit

istOperation

istKonstante

usw.

würde aber bei strings bleiben und beim Ausrechnen casten...


----------



## mbg (12. Jun 2005)

Musste es in leider in eine Liste packen.
Eclipse hat nicht bei allen Casts mitgespielt.
Aber auf jedenfall Danke für deine Denkanstöße.

mfg, mbg.


----------

