OCE.TypTest генерит код.
В Обероне парсинг и генерация кода происходят одновременно, т.к. компилятор однопроходный
PROCEDURE TypTest*(VAR x, y: OCT.Item; test: BOOLEAN);
PROCEDURE GTT(t0, t1: OCT.Struct; varpar: BOOLEAN);
VAR t: OCT.Struct; xt, tdes, p: OCT.Item;
BEGIN
IF t0 # t1 THEN t := t1;
REPEAT t := t.BaseTyp UNTIL (t = NIL) OR (t = t0);
IF t # NIL THEN x.typ := y.typ;
IF OCC.typchk OR test THEN xt := x;
IF varpar THEN xt.mode := Ind; xt.a0 := x.a0+4
ELSIF (x.mode = Var) & (x.lev >= 0) THEN
xt.mode := Ind; xt.a1 := -4; load(xt); xt.mode := RegI
ELSE load(xt); p := xt; p.mode := RegI; p.a1 := -4;
OCC.PutF4(17H, xt, p); (*MOVD -4(xt), xt *) xt.mode := RegI
END ;
xt.a1 := t1.n * 4; tdes.mode := Var; tdes.lev := -t1.mno; tdes.a0 := t1.adr;
OCC.PutF4(7, tdes, xt); (*CMPD*)
IF ~test THEN
OCC.PutF0(0); OCC.PutDisp(4); OCC.PutF1(0F2H); OCC.PutByte(18)
ELSE setCC(x, 0)
END
END
ELSE OCS.Mark(85);
IF test THEN x.typ := OCT.booltyp END
END
ELSIF test THEN setCC(x, 14)
END
END GTT;