summaryrefslogtreecommitdiff
path: root/khb/test.ml
diff options
context:
space:
mode:
Diffstat (limited to 'khb/test.ml')
-rw-r--r--khb/test.ml101
1 files changed, 101 insertions, 0 deletions
diff --git a/khb/test.ml b/khb/test.ml
new file mode 100644
index 0000000..68e3697
--- /dev/null
+++ b/khb/test.ml
@@ -0,0 +1,101 @@
+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_seq.exec_program (load_program primes_khs)