open Khs_ast open Khs_exec let primes_khs = [| SGoto (EStr "proc_main"); (* integers *) SLabel "proc_integers"; SGoto ( ETernary( EBinary(ELoad(ELocal "n"), GT, ELoad(ELocal "nmax")), EStr "_then1", EStr "_else1")); SLabel "_then1"; SSend(EInt (-1), ELocal "qo"); SGoto(EStr "_end1"); SLabel "_else1"; SSend(ELoad(ELocal "n"), ELocal "qo"); SSet(ELocal "n", EBinary(ELoad(ELocal "n"), PLUS, EInt 1)); SGoto (EStr "proc_integers"); SLabel "_end1"; SSet(ELocal "retval", EEmpty); SUnset [ELocal "qo"; ELocal "nmax"; ELocal "n"]; SGoto(ELoad(ELocal "retpos")); (* filter *) SLabel "proc_filter"; SRecv(ELocal "val", ELocal "qi"); SGoto(ETernary( EBinary(ELoad(ELocal "val"), NEQUAL, EInt (-1)), EStr "_then2", EStr "_else2")); SLabel "_then2"; SGoto(ETernary( EBinary(EBinary(ELoad(ELocal "val"), MOD, ELoad(ELocal "n")), NEQUAL, EInt 0), EStr "_then3", EStr "_end3")); SLabel "_then3"; SSend(ELoad(ELocal "val"), ELocal "qo"); SLabel "_end3"; SGoto(EStr "proc_filter"); SLabel "_else2"; SSend(EInt (-1), ELocal "qo"); SSet(ELocal "retval", EEmpty); SUnset[ELocal "qo"; ELocal "qi"; ELocal "val"; ELocal "n"]; SGoto(ELoad(ELocal "retpos")); (* primes *) SLabel "proc_primes"; SRecv(ELocal "val", ELocal "qi"); SGoto(ETernary( EBinary(ELoad(ELocal "val"), NEQUAL, EInt(-1)), EStr "_then4", EStr "_end4")); SLabel "_then4"; SSend(ELoad(ELocal "val"), EStr "stdout"); SSet(ELocal "c", ENewChan); SPar(EStr "_par_1"); SSet(ELocal "qi", ELoad(ECat(ELocal "c", EStr "in"))); SGoto(EStr "proc_primes"); SLabel "_end4"; SSet(ELocal "retval", EEmpty); SUnset[ELocal "qi"; ELocal "val"; ELocal "c"]; SGoto(ELoad(ELocal "retpos")); SLabel "_par_1"; SSet(ELocal "n", ELoad(ELocal "val")); SSet(ELocal "qo", ELoad(ECat(ELocal "c", EStr "out"))); SGoto(EStr "proc_filter"); (* main *) SLabel "proc_main"; SSet(ELocal "c", ENewChan); SPar(EStr "_par_2"); SSet(ELocal "qi", ELoad(ECat(ELocal "c", EStr "in"))); SSet(ELocal "retpos", EStr "_ret1"); SGoto(EStr "proc_primes"); SLabel "_par_2"; SSet(ELocal "n", EInt 2); SSet(ELocal "nmax", EInt 3000); SSet(ELocal "qo", ELoad(ECat(ELocal "c", EStr "out"))); SSet(ELocal "retpos", EStr "_ret1"); SGoto(EStr "proc_integers"); SLabel "_ret1"; SExit; |] let () = Array.iter Ksh_print.print_stmt primes_khs; Khs_exec_local.exec_program (load_program primes_khs)