Auswertung arithmetischer Ausdrücke mit SAX und Java

Status
Nicht offen für weitere Antworten.

mbg

Mitglied
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. :
Code:
<?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

Gesperrter Benutzer
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

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

Bleiglanz

Gesperrter Benutzer
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

Gesperrter Benutzer
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

Mitglied
@Bleiglanz: Thx,

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

mfg, mbg.
 

Bleiglanz

Gesperrter Benutzer
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

Mitglied
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben