-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlogoweb.ml
58 lines (44 loc) · 1.93 KB
/
logoweb.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
open Lexing
open Turtlegraphics
open Logoturtle
module Html = Dom_html
let js = Js.string
let document = Html.window##document
let append_text e s = Dom.appendChild e (document##createTextNode (js s))
let replace_child p n =
Js.Opt.iter (p##firstChild) (fun c -> Dom.removeChild p c);
Dom.appendChild p n
exception SyntaxError of string
let print_position lexbuf =
let pos = lexbuf.lex_curr_p in
Printf.sprintf "%s:%d:%d" pos.pos_fname pos.pos_lnum (pos.pos_cnum - pos.pos_bol + 1)
let parse_with_error lexbuf =
try Parser.prog Lexer.read lexbuf with
| SyntaxError msg ->
raise (SyntaxError ("Syntax error " ^ msg ^ (print_position lexbuf)))
| Parser.Error ->
raise (SyntaxError ("Parser error " ^ (print_position lexbuf)))
let rec parse_and_print lexbuf =
Logoturtle.print_commands (parse_with_error lexbuf)
let rec parse_print_and_eval lexbuf state =
let ast_list = parse_with_error lexbuf in
Logoturtle.print_commands ast_list;
print_string "\nnow evaling\n";
ignore (Logoturtle.eval_commands_return_state state ast_list);
""
let interpet d state str = let lexbuf = Lexing.from_string str in
try parse_print_and_eval lexbuf state with
| SyntaxError msg -> msg
| ArgumentException msg -> msg
| RuntimeException msg -> msg
| _ -> "unknown exception"
let div = Html.createDiv document
let start d s _ = Dom.appendChild document##body d;
Dom.appendChild d s.cr.cr;
ignore (interpet d s "rt 360");
Js._false
let _ =
let state = Logoturtle.create_state in
Html.window##onload <- Html.handler (start div state);
Js.Unsafe.global##printOCAMLString <- Js.wrap_callback (fun s -> print_endline ("Hi " ^ (Js.to_string s)));
Js.Unsafe.global##interpetLOGO <- Js.wrap_callback (fun s -> (js (interpet div state (Js.to_string s))))