let rec cmdsemantic (c: cmd) (dect: dec_table) proct = match c with
Ass(l,r) -> (checkLexp l dect proct) = (checkAexp r dect proct)
| Blk(cl) -> (
match cl with
[] -> true
| x::xs -> (cmdsemantic x dect proct) & (cmdsemantic (Blk(xs)) dect proct)
)
| Ite(b,c1,c2) -> ((checkBool b dect proct) = DBool) & (cmdsemantic c1 dect proct) & (cmdsemantic c2 dect proct)
| While(b,c) -> ((checkBool b dect proct) = DBool) & (cmdsemantic c dect proct)
| Repeat(c,b) -> ((checkBool b dect proct) = DBool) & (cmdsemantic c dect proct)
| For(i,s,f,c) -> let it = (checkAexp (Var(i)) dect proct) in
(it = (checkAexp s dect proct)) &
(it = (checkAexp f dect proct)) &
(it = DInt) &
(cmdsemantic c dect proct)
| Write(e) -> true
| PCall(i,pl) -> (
let pten = (Hashtbl.find proct i) in match pten with
Building(t, plist) -> (
if (checkParTypes (List.rev plist) (List.rev pl) dect proct)
then true
else raise (SEMANTIC_ERROR "Different Parameters Types")
)
| Subroutine(t,plist,ldtable,_) -> (
if (checkParTypes (List.rev plist) (List.rev pl) dect proct)
then true
else raise (SEMANTIC_ERROR "Different Parameters Types")
)
)