3-Adresscode für den Syntaxbaum, numerische Codierung Hilfsvariablen: h1 := 0 < Y h2 := 10 >= Y h3 := h1 and h2 h4 := X < 5 h5 := h4 and B h6 := not h5 h7 := h3 or h6 h8 := X + 1 100: if 0 < Y goto 103 101: h1 := 0 102: goto 104 103: h1 := 1 104: if 10 >= Y goto 107 105: h2 := 0 106: goto 108 107: h2 := 1 108: h3 := h1*h2 -- "and" als Bit-Multiplikation 109: if X < 5 goto 112 110: h4 := 0 111: goto 113 112: h4 := 1 113: h5 := h4*B 114: h6 := 1 - h5 -- "not" als "Bit-Umdrehen" 115: h7 := h3 + h6 -- "or" als "+" auf einem Bit (kein Übertrag) 116: if h7 goto 120 -- Sprung ans Ende der Schleife 117: h8 := X + 1 118: X := h8 119: goto 100 -- Sprung zurück zum Schleifentest 120: ... PROBLEM: Sprungziel für Zeile 116 ist erst bekannt, wenn der Schleifenrumpf erstellt ist! (Im Unterschied dazu: Bei den früheren Sprüngen stets bekannt) => Backpatching, Sprunglisten mitführen Sei E die Bedingung der While-Schleife. E.TRUELIST = Sprünge im 3-Adresscode von E zum "True"-Ausgang E.FALSELIST analog Im Bsp: E.TRUELIST = leer, E.FALSELIST = {116} Für die Sprünge in diesen Listen werden die Sprungziele später eingesetzt, wenn das jeweilige Ziel klar ist. Im Bsp: Sprungziel für "False" klar, wenn Z. 120 geschrieben wird 3-Adresscode mit Sprungmethode 100: if 0 < Y goto 102 101: goto [False des 1. and] 104 102: if 10 >= Y goto [True des 1. and] 108 103: goto [False des 1. and] 104 104: if X < 5 goto 106 [Falselist des 1. and behandeln] 105: goto [False des 2. and] 108 106: if B = 1 goto [True des 2. and] 111 107: goto [False des 2. and] 108 108: h8 := X + 1 [Truelist 1. and, Falselist 2. and] 109: X := h8 110: goto 100 111: ... [Truelist 2. and, Nextlist des while]