aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChouser <chouser@n01se.net>2015-01-28 09:06:53 -0500
committerChouser <chouser@n01se.net>2015-01-30 12:54:43 -0500
commit387da0bba9e58e35c6ab24a131b445d4330a8520 (patch)
tree92f8234199b41d366a4e53d4a0eb1d4bba1bb0a4
parent16b177329cac77136b236dfb3645e4be4e3df297 (diff)
downloadmal-387da0bba9e58e35c6ab24a131b445d4330a8520.tar.gz
mal-387da0bba9e58e35c6ab24a131b445d4330a8520.zip
Ocaml: fix list and comment parsing
-rw-r--r--ocaml/reader.ml23
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