let rec genBoolean (a: bexp) (dect: dec_table) (proct: proc_table) (ic: intermediateCode): element = match a with
B(b) -> if b then (Val(I(1))) else (Val(I(0)))
| Equ(ex1,ex2) -> (
let reg = (ic#getReg) and
(t1,t2) = (genArithmetical ex1 dect proct ic),(genArithmetical ex2 dect proct ic) in (
ic#addInstr(CNE, t1, t2, (Reg(reg,DInt)));
(Reg(reg,DInt))
)
)
| LE(ex1,ex2) -> (
let reg = (ic#getReg) and
(t1,t2) = (genArithmetical ex1 dect proct ic),(genArithmetical ex2 dect proct ic) in (
ic#addInstr(CG, t1, t2, (Reg(reg,DInt)));
(Reg(reg,DInt))
)
)
| LT(ex1,ex2) -> (
let reg = (ic#getReg) and
(t1,t2) = (genArithmetical ex1 dect proct ic),(genArithmetical ex2 dect proct ic) in (
ic#addInstr(CGE, t1, t2, (Reg(reg,DInt)));
(Reg(reg,DInt))
)
)
| Not(b) -> (
let reg = (ic#getReg) in (
ic#addInstr(NOT, (genBoolean b dect proct ic), Null, (Reg(reg,DInt)));
(Reg(reg,DInt))
)
)
| And(bex1,bex2) -> (
let reg = (ic#getReg) in (
ic#addInstr(AND, (genBoolean bex1 dect proct ic), (genBoolean bex2 dect proct ic), (Reg(reg,DInt)));
(Reg(reg,DInt))
)
)
| Or(bex1,bex2) -> (
let reg = (ic#getReg) in (
ic#addInstr(OR, (genBoolean bex1 dect proct ic), (genBoolean bex2 dect proct ic), (Reg(reg,DInt)));
(Reg(reg,DInt))
)
)