8 let qname ({Node.value = sym} as node) =
9 match List.rev @@ Str.split_delim dot sym with
11 failwith "must not happen"
13 {node with Node.value = ([],name)}
15 {node with Node.value = (List.rev ns,name^".")}
17 {node with Node.value = (List.rev ns,name)}
20 match Stream.peek stream with
21 Some (List {Node.value=xs}) ->
27 if Stream.peek xs' <> None then
28 raise (Stream.Error "")
35 match Stream.peek stream with
43 match Stream.peek stream with
44 Some (Symbol {Node.value = v}) when kwd = v->
51 [< x = hd; y = Parsec.many tl>] ->
55 parser [< x = car; y = cdr >] ->
58 let variable_arguments = [
73 | [<' Symbol name >] ->
75 | [< e = list p_list >] ->
79 [<' Symbol var; init = expr >] ->
83 [< e = Parsec.many expr >] ->
87 [< _ = kwd "else"; body = block>] ->
89 | [< cond = expr; body = block>] ->
93 [< _ = kwd "if"; t = expr; c = expr; a = expr >] ->
95 | [< _ =kwd "cond"; body = Parsec.many @@ list cond_clause >] ->
101 | `Cond (cond,body) ->
104 | [< _ = kwd "let"; vars = list @@ Parsec.many @@ list vars;
105 body = Parsec.many expr>] ->
106 `Let (vars,`Block body)
107 | [< _ = kwd "letrec"; vars = list @@ Parsec.many @@ list vars;
110 | [< _ = kwd "begin"; body = block >] ->
112 | [< _ = kwd "array"; xs = Parsec.many expr >] ->
114 | [< _ = kwd "lambda"; args = list @@ Parsec.many symbol; body = block >] ->
116 | [< _ = kwd "new"; name = symbol; args = Parsec.many expr >] ->
117 `New (qname name,args)
118 | [< _ = kwd "."; obj = expr; (name,args) = list @@ one_list symbol expr >] ->
119 `Invoke (obj,name,args)
120 | [< _ = kwd "slot-ref"; obj = expr; name = symbol >] ->
122 | [< _ = kwd "slot-set!";obj = expr;
123 name = symbol; value = expr>] ->
124 `SlotSet (obj,name,value)
125 | [< _ = kwd "list"; xs = Parsec.many expr >] ->
127 `Call [`Var (Node.ghost ([],"cons")); x; y] in
129 `Var (Node.ghost ([],"nil")) in
130 List.fold_right cons xs nil
131 | [< Symbol op = HList.fold_left1 (<|>) @@ List.map kwd variable_arguments;
132 args = Parsec.many expr >] ->
135 HList.fold_left1 (fun x y -> `Call [op'; x; y]) args
136 | [< xs = Parsec.many1 expr >] ->
141 [< _ = kwd "define"; name = symbol; body = Parsec.many expr >] ->
142 `Define (name,`Block body)
146 [< _ = kwd "define"; (name,args) = list @@ one_list symbol symbol; body = block >] ->
148 `Lambda (args,body) in
152 (try_ define_value) <|> define_func
154 let is_valid_module xs =
165 type 'expr method_ = {
166 method_name : [`Public of sname | `Static of sname];
173 [<_ = kwd "method"; name = symbol; args = list @@ many symbol; body = block>] ->
175 Ast.method_name = `Public name;
179 | [<_ = kwd "static"; name = symbol; args = list @@ many symbol; body = block>] ->
181 Ast.method_name = `Static name;
188 [< def = define >] ->
190 | [< _ = kwd "open"; module_name = symbol >] ->
191 `Open (Node.lift (Str.split_delim dot) module_name)
192 | [< _ = kwd "class";
194 supers = list @@ many symbol;
195 attrs = list @@ many symbol;
196 methods = many @@ list p_method>] ->
200 | [] -> Node.ghost "Object"
201 | _ -> Parsec.fail () in
202 `Class {Ast.class_name = name;
206 | [< _ = kwd "module"; name = symbol; exports = list @@ many symbol; stmts = many stmt>] ->
208 (* exports nothing must not be happened. *)
209 `Module {Ast.module_name=name;
213 `Module {Ast.module_name=name;
214 exports=`Only exports;
218 [< s = list p_stmt >] ->
226 {n with Node.value = s}
228 {n with Node.value = s}
230 {n with Node.value = s}
232 {n with Node.value = s}
234 {n with Node.value = s}
236 {n with Node.value = s}
241 many (syntax_error (stmt <?> "malformed syntax") (loc "")) stream'