diff options
Diffstat (limited to 'Semestr 3/pf/lista13')
-rw-r--r-- | Semestr 3/pf/lista13/BF.he | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/Semestr 3/pf/lista13/BF.he b/Semestr 3/pf/lista13/BF.he new file mode 100644 index 0000000..cf33e4f --- /dev/null +++ b/Semestr 3/pf/lista13/BF.he @@ -0,0 +1,57 @@ +effect Reader X = + { ask : Unit => Option X + } + +let hReadString str c = + handle c () with + | ask () => fn pos => + if pos >= String.length str then + resume None pos + else + resume (Some (String.get pos str)) (pos+1) + | return x => fn _ => x + end 0 + +data rec BF = +| MoveR +| MoveL +| Inc +| Dec +| Output +| Input +| While of List BF + +let parse str = + let rec parse () = + match ask () with + | None => [] + | Some c => + if Char.equal c '>' then MoveR :: parse () + elif Char.equal c '<' then MoveL :: parse () + elif Char.equal c '+' then Inc :: parse () + elif Char.equal c '-' then Dec :: parse () + elif Char.equal c '.' then Output :: parse () + elif Char.equal c ',' then Input :: parse () + elif Char.equal c '[' then + begin let body = parse () in + While body :: parse () + end + elif Char.equal c ']' then [] + else parse () + end + in + handle parse () with hReadString str + +(** Odczytanie pojedynczego znaku ze standardowego wejścia *) +let tryReadChar () = + let str = input stdin 1 in + if String.length str = 1 then + Some (String.get 0 str) + else None + +(** Wypisanie pojedynczego znaku na standardowe wyjście *) +let printChar c = + outputString stdout (String.repeat 1 c) + +(* Do konwersji pomiędzy typami Char i Int możesz użyć funkcji +* Char.chr oraz Char.code *)
\ No newline at end of file |