From d2b12fdf5681a71f1f6a295b0591e4d8213fb41d Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Tue, 10 May 2016 21:12:44 +0200 Subject: Straightforward While lexer, parser and interpreter --- paper/While/Simple.icl | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 paper/While/Simple.icl (limited to 'paper/While/Simple.icl') diff --git a/paper/While/Simple.icl b/paper/While/Simple.icl new file mode 100644 index 0000000..9138f1f --- /dev/null +++ b/paper/While/Simple.icl @@ -0,0 +1,22 @@ +implementation module Simple + +import StdString + +import WhileCommon +import Common + +instance toString Stm +where + toString (Ass v a) = v <+ " := " <+ a + toString (If b s1 s2) = "if " <+ b <+ " then " <+ s1 <+ " else " <+ s2 + toString (While b s) = "while " <+ b <+ " do " <+ s + toString Skip = "skip" + toString (Compose s1 s2) = s1 <+ "; " <+ s2 + +instance run Stm +where + run (Ass v e) st = eval e st >>= \r -> pure (\w -> if (w==v) (pure r) (st w)) + run (If b s1 s2) st = eval b st >>= \r -> run (if r s1 s2) st + run w=:(While b s) st = eval b st >>= \r -> if r (run s st >>= \st` -> run w st`) (pure st) + run Skip st = pure st + run (Compose s1 s2) st = run s1 st >>= \st` -> run s2 st` -- cgit v1.2.3