Naja, das Problem löst sich eigentlich von ganz alleine, wenn man das Prinzip mit dem Tokenbaum verstanden hat.
Dies ist übrigends die Ausgabe die mein Compiler mit der Option -stt anzeigt:
mtl: 'var=200*(var2+x/2)-4;'
var
200*(var2+x/2)-4
200*(var2+x/2)
(var2+x/2)
x/2
│ ├-1 <int> 4
├-1 <int> -
│ │ │ │ ├-1 <int> 2
│ │ │ ├-1 <int> /
│ │ │ │ ├-1 <int> x
│ │ ├-1 <int> +
│ │ │ ├-1 <int> var2
│ ├-1 <int> *
│ │ ├-1 <int> 200
├-1 <int> =
├-1 <int> var
Wie zu erkennen ist sind die Operatoren nach ihrer Wertigkeit angeordent, wobei die Klammern diese überschreiben. In der Abarbeitung des Baumes werden nun also nur noch die einzelnen Operationen durchgeführt, wie man aus dem Listing unten erkennen kann.
Es wird also erst der linke (?) Ast durchgegangen, bis eine 2 im eax zurück kommt, dann wird sie gepuscht, der rechte Ast am Knoten bearbeitet, was den Inhalt von x liefert, dann wird gepopt und dann dividiert, das Ergebnis wird wieder in eax zurück geliefert, klar soweit?
0001: main()
main_begin:
6689E5 mov ebp,esp
{
< create int x (4) >
< create int var2 (4) >
< create int var (4) >
6681EC0C000000 sub esp,0c
< local stack: 4 >
0003: var=200*(var2+x/2)-4;
66B804000000 mov eax,04
6650 push eax
66B8C8000000 mov eax,0c8
6650 push eax
66B802000000 mov eax,02
6650 push eax
66678B45F4 mov eax,[ebp-0c]
665B pop ebx
6631D2 xor edx,edx
66F7F3 div ebx
6650 push eax
66678B45F8 mov eax,[ebp-08]
665B pop ebx
6603C3 add eax,ebx
665B pop ebx
66F7E3 mul ebx
665B pop ebx
662BC3 sub eax,ebx
66678945FC mov [ebp-04],eax
6681C40C000000 add esp,0c
66C3 ret
}
0004: end of main()
Ich hoffe das Prinzip ist klar geworden. Wie genau machst du das? Aus deiner Beschreibung heraus denke ich ohne Baum, oder?
Kann man deinen Compiler irgendwo sehen?
MM