diff options
| author | Chouser <chouser@n01se.net> | 2015-01-28 09:06:53 -0500 |
|---|---|---|
| committer | Chouser <chouser@n01se.net> | 2015-01-30 12:54:43 -0500 |
| commit | 387da0bba9e58e35c6ab24a131b445d4330a8520 (patch) | |
| tree | 92f8234199b41d366a4e53d4a0eb1d4bba1bb0a4 | |
| parent | 16b177329cac77136b236dfb3645e4be4e3df297 (diff) | |
| download | mal-387da0bba9e58e35c6ab24a131b445d4330a8520.tar.gz mal-387da0bba9e58e35c6ab24a131b445d4330a8520.zip | |
Ocaml: fix list and comment parsing
| -rw-r--r-- | ocaml/reader.ml | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/ocaml/reader.ml b/ocaml/reader.ml index 96404aa..0bb4328 100644 --- a/ocaml/reader.ml +++ b/ocaml/reader.ml @@ -47,18 +47,21 @@ let with_meta obj meta = | T.Symbol { T.value = value } -> T.Symbol { T.value = value; T.meta = meta }; | _ -> raise (Invalid_argument "metadata not supported on this type") -let rec read_list list_reader = +let rec read_list eol list_reader = match list_reader.tokens with - | [] -> output_string stderr "expected ')', got EOF\n"; + | [] -> output_string stderr ("expected '" ^ eol ^ "', got EOF\n"); flush stderr; raise End_of_file; | token :: tokens -> - if Str.string_match (Str.regexp "[])}]") token 0 then + if Str.string_match (Str.regexp eol) token 0 then {list_form = list_reader.list_form; tokens = tokens} + else if token.[0] = ';' then + read_list eol { list_form = list_reader.list_form; + tokens = tokens } else let reader = read_form list_reader.tokens in - read_list {list_form = list_reader.list_form @ [reader.form]; - tokens = reader.tokens} + read_list eol {list_form = list_reader.list_form @ [reader.form]; + tokens = reader.tokens} and read_quote sym tokens = let reader = read_form tokens in {form = Types.list [ Types.symbol sym; reader.form ]; @@ -80,18 +83,20 @@ and read_form all_tokens = form = Types.list [Types.symbol "with-meta"; value.form; meta.form]; tokens = value.tokens} | "(" -> - let list_reader = read_list {list_form = []; tokens = tokens} in + let list_reader = read_list ")" {list_form = []; tokens = tokens} in {form = Types.list list_reader.list_form; tokens = list_reader.tokens} | "{" -> - let list_reader = read_list {list_form = []; tokens = tokens} in + let list_reader = read_list "}" {list_form = []; tokens = tokens} in {form = Types.list_into_map Types.MalMap.empty list_reader.list_form; tokens = list_reader.tokens} | "[" -> - let list_reader = read_list {list_form = []; tokens = tokens} in + let list_reader = read_list "]" {list_form = []; tokens = tokens} in {form = Types.vector list_reader.list_form; tokens = list_reader.tokens} - | _ -> {form = read_atom token; tokens = tokens} + | _ -> if token.[0] = ';' + then read_form tokens + else {form = read_atom token; tokens = tokens} let read_str str = (read_form (List.filter ((<>) "") (find_re token_re str))).form |
