Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.00 KB | None | 0 0
  1. open Sexplib.Sexp
  2.  
  3. let rec parse_bindings bindings =
  4. match bindings with
  5. | [] -> []
  6. | first::rest ->
  7. match first with
  8. | List([Atom(name); e]) ->
  9. [(name, parse e)] @ (parse_bindings rest)
  10.  
  11. let rec parse sexp : expr =
  12. match sexp with
  13. | Atom(s) ->
  14. (match int_of_string_opt s with
  15. | Some(num) -> ENumber(num)
  16. | None -> if mem s reserved_words then failwith "s is a reserved keyword" else EId(s))
  17. | List(sexps) ->
  18. match sexps with
  19. | [Atom("add1"); arg] -> EPrim1(Add1, parse arg)
  20. | [Atom("sub1"); arg] -> EPrim1(Sub1, parse arg)
  21. | [Atom("+"); arg1; arg2] -> EPrim2(Plus, parse arg1, parse arg2)
  22. | [Atom("-"); arg1; arg2] -> EPrim2(Minus, parse arg1, parse arg2)
  23. | [Atom("*"); arg1; arg2] -> EPrim2(Times, parse arg1, parse arg2)
  24. | [Atom("let"); List(bindings_sexp); e2] ->
  25. let binding_expr = parse_bindings bindings in
  26. ELet(binding_expr, parse e2)
  27. | _ -> failwith "foo"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement