programmierung einer scriptsprache:simulieren des stapels
-
ich hab mir jetzt vor ein paar tagen das dragonbook besorgt, und bin nun dabei, mich in die thematik einzuarbeiten.
das problem ist, dass sich ja das dragonbook darauf stützt, dass man am ende assembler code hat(man also eine echte programmiersprache macht), was es bei scriptsprachen so nicht direkt gibt,schon allein deshalb, weil man scriptsprachen nur parsed und nicht kompiliert-man muss also die grundlegenden fähigkeiten der speicherverwaltung simulieren.ein problem ist die simulierung eines "stapels"
bsp:a=1*2+3*4
die ergebnisse von 1*2 und 3*4 müssen auf dem stapel zwischengespeichert werden, damit sie hinterher addiert werden können.
ich habe mir überlegt, dass ich das problem mithilfe eines leicht modifizierten stacks lösen könnte(ausgegebene werte müssen sofort aus dem stapel gelöscht werden, da die sache sonst viel komplexer wird),aber die lösung empfinde ich als nicht sehr elegant, was würdet ihr vorschlagen?
-
Bei Stapel fällt mir erstmal std::stack<...> ein, vielleicht hilft dir der ein wenig.
-
hmm stack hab ich ja auch in betracht gezogen,doch dann gibts dieses problem:
//erstmal die schrittweise abarbeitung der rechnung 1*2-3*4 m_stack.push(1*2);//m steht für modifiziert, dh nach jedem top() wird der oberste wert gelöscht m_stack.push(3*4); m_stack.top()-m_stack.top();
hierbei kommt nicht raus was erwartet wird,zwar werden im modifizierten stack die werte nach ihrem auslesen korrekt gelöscht,aber sie haben die falsche reihenfolge, sodass aus 1*2-3*4 3*4-1*2 wird, man müsste also rein theoretisch den parsebaum spiegeln, aber das ist sehr komplex...
-
warum nicht so:
int x,y; m_stack.push(1*2); m_stack.push(3*4); x = m_stack.top(); m_stack.pop(); y = m_stack.top(); m_stack.pop(); m_stack.push(y - x);
Die Funktionsweise von std::stack muss man natürlich kennen, sonst wird das nix.
-
@ bashar hmm hab ichd as nich gesagt?
test(a,b); test(1,2); int x,y x=container.top(); container.pop(); y=container.top(); container.pop(); test(x,y)//etwas umständlich und wenig oop,aber is natürlich gut möglich //aber so meinte ich das^^ T m_x::top(){ T value=container.top(); container.pop(); return value; } test(m_x.top(),m_x.top());
ich weis wie stack funktioniert, du musst mir das net erklären,deshalb hab ich ja schon von den modifikationen gesprochen,damit automatisch pop aufgerufen wird.
-
Implementir die Operatoren doch einfach als Funktionen. Also du push einfach 1 und 2 auf den Stack und du rufest * auf. Dann pushst du den return Wert auf den Stack. Nun pushs du 3 und 4 auf den Stack unf rufest * auf. Nun pushs du den return Wert auf den Stack und rufest + auf. Wenn du jetzt am Ende des Statements angekommen bist lässt du den return Wert fallen, das heist du veränderst ihn nicht und er wird nächstes Mal überschrieben, wenn es allerdings noch nicht das Ende ist : auf den Stack damit und weiter aufrufen.
-
RPN (Reverse Polish Notation) verwenden, da hast du solche probs nicht, brauchst du nur 3 register...
-
klar, die postfix notation kenn ich, halt dass beim rpn noch gedreht wird...
//edit ändert natürlich nichts dran, dass ich trotzdem noch den stack simulieren muss, da ich keinen zugriff auf die register hab
-
ich meine jetzt keine CPU-Register, sondern einfach variablen x, y und z
-
todo schrieb:
ich meine jetzt keine CPU-Register, sondern einfach variablen x, y und z
was meinste, wo eine normale variable wie int i; im speicher liegt?
auf dem stack, und den muss ich simulieren,da mir solche sachen ja zur compilezeit des programms nicht bekannt sind, wie gesagt scriptsprache
-
nein, um mittels RPN normale Formeln auszurechnen, brauchst du nur die drei variablen x, y, z ein stack ist (zumindest bei diesem ansatz) völlig überdimensioniert... und x, y und z kannst du fest deklarieren, von mir aus auch anders benennen...
-
nein falsch, war quark, schau dir das mal an, da wird auch ein stack benutzt:
http://www.free2code.net/code/cpp/11/code_245.php
oder das (is allerdings perl)
http://home.earthlink.net/~jrhay/src/perl/equation
oder verwirf mein ansatz und mein gelaber ganz, ist wahrscheinlich das beste