/[svn]/parser/parser.ml
ViewVC logotype

Contents of /parser/parser.ml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 224 - (hide annotations)
Tue Jul 10 17:16:14 2007 UTC (5 years, 10 months ago) by abate
File size: 11565 byte(s)
[r2003-03-08 03:46:23 by cvscast] Empty log message

Original author: cvscast
Date: 2003-03-08 03:46:23+00:00
1 abate 4 open Location
2     open Ast
3    
4 abate 161 (*
5 abate 151 let () = Grammar.error_verbose := true
6 abate 161 *)
7 abate 81
8     let gram = Grammar.gcreate (Wlexer.lexer Wlexer.token Wlexer.latin1_engine)
9    
10    
11 abate 38 let prog = Grammar.Entry.create gram "prog"
12     let expr = Grammar.Entry.create gram "expression"
13     let pat = Grammar.Entry.create gram "type/pattern expression"
14     let regexp = Grammar.Entry.create gram "type/pattern regexp"
15     let const = Grammar.Entry.create gram "scalar constant"
16    
17     let rec multi_prod loc = function
18     | [ x ] -> x
19     | x :: l -> mk loc (Prod (x, multi_prod loc l))
20     | [] -> assert false
21    
22     let rec tuple loc = function
23     | [ x ] -> x
24 abate 91 | x :: l -> mk loc (Pair (x, tuple loc l))
25 abate 38 | [] -> assert false
26 abate 89
27     let tuple_queue =
28     List.fold_right (fun x q -> mk x.loc (Pair (x, q)))
29    
30 abate 38 let char = mk noloc (Internal (Types.char Chars.any))
31 abate 66 let string_regexp = Star (Elem char)
32 abate 38
33     let cst_nil = mk noloc (Cst (Types.Atom Sequence.nil_atom))
34    
35 abate 66 let seq_of_string pos s =
36     let (pos,_) = pos in
37     let rec aux accu i =
38     if (i = 0)
39     then accu
40     else aux (((pos+i,pos+i+1),s.[i-1])::accu) (i-1) in
41 abate 38 aux [] (String.length s)
42 abate 4
43 abate 81 exception Error of string
44     let error loc s = raise (Location (loc, Error s))
45 abate 18
46 abate 81 let parse_char loc s =
47     (* TODO: Unicode *)
48     if String.length s <> 1 then
49     error loc "Character litteral must have length 1";
50     s.[0]
51    
52 abate 66 let char_list pos s =
53 abate 81 let s = seq_of_string pos s in
54 abate 222 List.map (fun (loc,c) -> mk loc (Cst (Types.Char (Chars.mk_char c)))) s
55 abate 18
56    
57 abate 38 EXTEND
58 abate 10 GLOBAL: prog expr pat regexp const;
59 abate 4
60 abate 10 prog: [
61 abate 14 [ l = LIST0 [ p = phrase; ";;" -> mk loc p ]; EOI -> l ]
62 abate 10 ];
63    
64 abate 13 phrase: [
65 abate 66 [ (p,e) = let_binding -> LetDecl (p,e)
66     | (p,e1) = let_binding; "in"; e2 = expr LEVEL "top"->
67     EvalStatement (mk loc (Match (e1,[p,e2])))
68 abate 81 | LIDENT "type"; x = UIDENT; "="; t = pat -> TypeDecl (x,t)
69     | LIDENT "debug"; d = debug_directive -> Debug d
70 abate 66 ] |
71     [ e = expr -> EvalStatement e
72 abate 43 ]
73 abate 13 ];
74    
75 abate 43 debug_directive: [
76     [ LIDENT "filter"; t = pat; p = pat -> `Filter(t,p)
77 abate 75 | LIDENT "accept"; p = pat -> `Accept p
78 abate 43 | LIDENT "compile"; t = pat; p = LIST1 pat -> `Compile (t,p)
79 abate 75 | LIDENT "normal_record"; t = pat -> `Normal_record t
80 abate 145 | LIDENT "compile2"; t = pat; p = LIST1 pat -> `Compile2 (t,p)
81 abate 224 | LIDENT "subtype"; t1 = pat; t2 = pat -> `Subtype (t1,t2)
82 abate 43 ]
83     ];
84    
85 abate 4 expr: [
86     "top" RIGHTA
87     [ "match"; e = SELF; "with"; b = branches -> mk loc (Match (e,b))
88 abate 64 | "try"; e = SELF; "with"; b = branches ->
89     let default =
90     (mk noloc (Capture "x"),
91     mk noloc (Op ("raise",[mk noloc (Var "x")]))) in
92     mk loc (Try (e,b@[default]))
93 abate 81 | "map"; e = SELF; "with"; b = branches -> mk loc (Map (e,b))
94 abate 17 | "transform"; e = SELF; "with"; b = branches ->
95 abate 121 let default = mk noloc (Capture "x"), cst_nil in
96     mk loc (Op ("flatten", [mk loc (Map (e,b@[default]))]))
97 abate 48 | "fun"; (f,a,b) = fun_decl ->
98 abate 4 mk loc (Abstraction { fun_name = f; fun_iface = a; fun_body = b })
99     | (p,e1) = let_binding; "in"; e2 = expr LEVEL "top"->
100     mk loc (Match (e1,[p,e2]))
101 abate 54 | e = expr; ":"; p = pat ->
102     mk loc (Forget (e,p))
103 abate 4 ]
104    
105    
106 abate 15 |
107 abate 51 [ e1 = expr; op = ["+" | "-" | "@"]; e2 = expr -> mk loc (Op (op,[e1;e2]))
108     ]
109 abate 16 |
110 abate 151 [ e1 = expr; op = ["*"]; e2 = expr -> mk loc (Op (op,[e1;e2]))
111     | e = expr; op = "/"; p = pat ->
112    
113     let tag = mk loc (Internal (Types.atom (Atoms.any))) in
114     let att = mk loc (Internal Types.Record.any) in
115     let any = mk loc (Internal (Types.any)) in
116     let re = Star(Alt(SeqCapture("x",Elem p), Elem any)) in
117     let ct = mk loc (Regexp (re,any)) in
118     let p = mk loc (XmlT (tag, multi_prod loc [att;ct])) in
119     let b = (p, mk loc (Var "x")) in
120     mk loc (Op ("flatten", [mk loc (Map (e,[b]))]))
121 abate 51 ]
122 abate 26 |
123 abate 78 [ e = expr; "."; l = [LIDENT | UIDENT] ->
124     mk loc (Dot (e,Types.LabelPool.mk l))
125 abate 51 ]
126 abate 26
127 abate 52 |
128 abate 66 [ op = [ LIDENT "flatten"
129     | LIDENT "load_xml"
130 abate 188 | LIDENT "load_html"
131 abate 76 | LIDENT "print_xml"
132 abate 124 | LIDENT "print"
133 abate 66 | LIDENT "raise"
134     | LIDENT "int_of"
135 abate 133 | LIDENT "string_of"
136 abate 66 ];
137     e = expr -> mk loc (Op (op,[e]))
138 abate 126 | op = [ LIDENT "dump_to_file" ];
139     e1 = expr LEVEL "no_appl"; e2 = expr -> mk loc (Op (op, [e1;e2]))
140 abate 151 | e1 = SELF; LIDENT "div"; e2 = expr -> mk loc (Op ("/", [e1;e2]))
141 abate 210 | e1 = SELF; LIDENT "mod"; e2 = expr -> mk loc (Op ("mod", [e1;e2]))
142 abate 151 | e1 = SELF; e2 = expr -> mk loc (Apply (e1,e2))
143 abate 52 ]
144    
145 abate 4 | "no_appl"
146     [ c = const -> mk loc (Cst c)
147     | "("; l = LIST1 expr SEP ","; ")" -> tuple loc l
148 abate 18 | "["; l = LIST0 seq_elem; e = OPT [ ";"; e = expr -> e ]; "]" ->
149     let e = match e with Some e -> e | None -> cst_nil in
150 abate 89 List.fold_right
151     (fun x q ->
152     match x with
153     | `Elems l -> tuple_queue l q
154     | `Explode x -> mk x.loc (Op ("@",[x;q]))
155     ) l e
156 abate 81 | t = [ a = TAG ->
157 abate 222 mk loc (Cst (Types.Atom (Atoms.mk a)))
158 abate 81 | "<"; e = expr LEVEL "no_appl" -> e ];
159     a = expr_attrib_spec; ">"; c = expr ->
160 abate 110 mk loc (Xml (t, mk loc (Pair (a,c))))
161 abate 4 | "{"; r = [ expr_record_spec | -> mk loc (RecordLitt []) ]; "}" -> r
162 abate 81 | s = STRING2 ->
163 abate 38 tuple loc (char_list loc s @ [cst_nil])
164 abate 4 | a = LIDENT -> mk loc (Var a)
165     ]
166    
167     ];
168 abate 18
169     seq_elem: [
170 abate 89 [ x = STRING1 -> `Elems (char_list loc x)
171     | e = expr LEVEL "no_appl" -> `Elems [e]
172     | "!"; e = expr LEVEL "no_appl" -> `Explode e
173 abate 18 ]
174     ];
175 abate 4
176     let_binding: [
177     [ "let"; p = pat; "="; e = expr -> (p,e)
178 abate 54 | "let"; p = pat; ":"; t = pat; "="; e = expr -> (p, mk noloc (Forget (e,t)))
179 abate 48 | "let"; "fun"; (f,a,b) = fun_decl ->
180     let p = match f with
181     | Some x -> mk loc (Capture x)
182     | _ -> failwith "Function name mandatory in let fun declarations"
183     in
184     let abst = { fun_name = f; fun_iface = a; fun_body = b } in
185 abate 4 let e = mk loc (Abstraction abst) in
186 abate 48 (p,e);
187 abate 4 ]
188     ];
189    
190 abate 48 fun_decl: [
191 abate 85 (* need an hack to do this, because both productions would
192     match [ OPT LIDENT; "("; pat ] .... *)
193     [ f = OPT LIDENT; "("; p1 = pat LEVEL "no_arrow";
194     res = [ "->"; p2 = pat;
195     a = [ ";"; a = LIST0 arrow SEP ";" -> a | -> [] ];
196     ")"; b = branches -> `Classic (p2,a,b)
197     | ":"; targ1 = pat;
198     args = LIST0 [ ","; arg = pat; ":"; targ = pat -> (arg,targ) ];
199     ")"; ":"; tres = pat ;
200     "="; body = expr ->
201     `Compact (targ1,args,tres,body)
202     ] ->
203     match res with
204     | `Classic (p2,a,b) -> f,(p1,p2)::a,b
205     | `Compact (targ1,args,tres,body) ->
206     let args = (p1,targ1) :: args in
207     let targ = multi_prod noloc (List.map snd args) in
208     let arg = multi_prod noloc (List.map fst args) in
209     let b = [arg, body] in
210     let a = [targ,tres] in
211     (f,a,b)
212 abate 48 ]
213     ];
214    
215 abate 85 arrow: [
216 abate 9 [ t1 = pat LEVEL "no_arrow"; "->"; t2 = pat -> (t1,t2)]
217 abate 4 ];
218    
219     branches: [
220 abate 81 [ OPT "|"; l = LIST1 branch SEP "|" -> l ]
221 abate 4 ];
222    
223     branch: [
224 abate 6 [ p = pat LEVEL "no_arrow"; "->"; e = expr -> (p,e) ]
225 abate 4 ];
226    
227    
228     regexp: [
229     [ x = regexp; "|"; y = regexp -> Alt (x,y) ]
230     | [ x = regexp; y = regexp -> Seq (x,y) ]
231     | [ a = LIDENT; "::"; x = regexp -> SeqCapture (a,x) ]
232     | [ x = regexp; "*" -> Star x
233     | x = regexp; "*?" -> WeakStar x
234     | x = regexp; "+" -> Seq (x, Star x)
235     | x = regexp; "+?" -> Seq (x, WeakStar x)
236 abate 71 | x = regexp; "?" -> Alt (x, Epsilon)
237 abate 4 | x = regexp; "??" -> Alt (Epsilon, x) ]
238     | [ "("; x = regexp; ")" -> x
239 abate 120 | "("; a = LIDENT; ":="; c = const; ")" -> Elem (mk loc (Constant (a,c)))
240 abate 66 | UIDENT "PCDATA" -> string_regexp
241 abate 81 | i = STRING1; "--"; j = STRING1 ->
242 abate 222 let i = Chars.mk_char (parse_char loc i)
243     and j = Chars.mk_char (parse_char loc j) in
244 abate 66 Elem (mk loc (Internal (Types.char (Chars.char_class i j))))
245 abate 81 | s = STRING1 ->
246     let s = seq_of_string loc s in
247 abate 18 List.fold_right
248 abate 66 (fun (loc,c) accu ->
249 abate 222 let c = Chars.mk_char c in
250 abate 18 let c = Chars.atom c in
251     Seq (Elem (mk loc (Internal (Types.char c))), accu))
252     s
253 abate 66 Epsilon
254 abate 4 | e = pat LEVEL "simple" -> Elem e
255     ]
256     ];
257    
258     pat: [
259     [ x = pat; "where";
260     b = LIST1 [ a = UIDENT; "="; y = pat -> (a,y)] SEP "and"
261     -> mk loc (Recurs (x,b)) ]
262     | RIGHTA [ x = pat; "->"; y = pat -> mk loc (Arrow (x,y)) ]
263 abate 6 | "no_arrow" [ x = pat; "|"; y = pat -> mk loc (Or (x,y)) ]
264 abate 121 | "simple" [ x = pat; "&"; y = pat -> mk loc (And (x,y))
265 abate 99 | x = pat; "\\"; y = pat -> mk loc (Diff (x,y)) ]
266 abate 4 |
267 abate 159 [ "{"; r = record_spec; "}" -> mk loc (Record (true,r))
268     | "{|"; r = record_spec; "|}" -> mk loc (Record (false,r))
269 abate 4 | LIDENT "_" -> mk loc (Internal Types.any)
270     | a = LIDENT -> mk loc (Capture a)
271     | "("; a = LIDENT; ":="; c = const; ")" -> mk loc (Constant (a,c))
272     | a = UIDENT -> mk loc (PatVar a)
273     | i = INT ; "--"; j = INT ->
274 abate 222 let i = Intervals.mk i
275     and j = Intervals.mk j in
276 abate 52 mk loc (Internal (Types.interval (Intervals.bounded i j)))
277     | i = INT ->
278 abate 222 let i = Intervals.mk i in
279 abate 52 mk loc (Internal (Types.interval (Intervals.atom i)))
280 abate 81 | "*"; "--"; j = INT ->
281 abate 222 let j = Intervals.mk j in
282 abate 52 mk loc (Internal (Types.interval (Intervals.left j)))
283 abate 81 | i = INT; "--"; "*" ->
284 abate 222 let i = Intervals.mk i in
285 abate 52 mk loc (Internal (Types.interval (Intervals.right i)))
286 abate 19 | i = char ->
287     mk loc (Internal (Types.char (Chars.char_class i i)))
288 abate 13 | i = char ; "--"; j = char ->
289 abate 18 mk loc (Internal (Types.char (Chars.char_class i j)))
290 abate 4 | c = const -> mk loc (Internal (Types.constant c))
291     | "("; l = LIST1 pat SEP ","; ")" -> multi_prod loc l
292     | "["; r = [ r = regexp -> r | -> Epsilon ];
293     q = [ ";"; q = pat -> q
294 abate 18 | -> mk noloc (Internal (Sequence.nil_type)) ];
295 abate 4 "]" -> mk loc (Regexp (r,q))
296 abate 81 | t = [
297     [ "<"; LIDENT "_" -> mk loc (Internal (Types.atom (Atoms.any)))
298     | a = TAG ->
299     mk loc
300 abate 222 (Internal (Types.atom (Atoms.atom (Atoms.mk a)))) ]
301 abate 81 | [ "<"; t = pat -> t ]
302     ];
303     a = attrib_spec; ">"; c = pat ->
304 abate 110 mk loc (XmlT (t, multi_prod loc [a;c]))
305 abate 81 | s = STRING2 ->
306     let s = seq_of_string loc s in
307 abate 63 let s = List.map
308 abate 66 (fun (loc,c) ->
309 abate 63 mk loc (Internal
310     (Types.char
311     (Chars.atom
312 abate 222 (Chars.mk_char c))))) s in
313 abate 63 let s = s @ [mk loc (Internal (Sequence.nil_type))] in
314     multi_prod loc s
315 abate 4 ]
316    
317     ];
318    
319     record_spec:
320 abate 81 [ [ r = LIST0 [ l = [LIDENT | UIDENT]; "=";
321     o = [ "?" -> true | -> false];
322 abate 159 x = pat -> (Types.LabelPool.mk l,o,x)
323 abate 4 ] SEP ";" ->
324 abate 159 (* TODO: check here uniqueness *)
325     List.sort (fun (l1,_,_) (l2,_,_) -> compare l1 l2) r
326 abate 4 ] ];
327    
328 abate 13 char:
329     [
330 abate 222 [ c = STRING1 -> Chars.mk_char (parse_char loc c)
331     | "!"; i = INT -> Chars.mk_int (int_of_string i) ]
332 abate 13 ];
333    
334    
335 abate 4 const:
336     [
337 abate 222 [ i = INT -> Types.Integer (Intervals.mk i)
338     | "`"; a = [LIDENT | UIDENT] -> Types.Atom (Atoms.mk a)
339 abate 13 | c = char -> Types.Char c ]
340 abate 4 ];
341    
342    
343     attrib_spec:
344 abate 159 [ [ r = record_spec -> mk loc (Record (true,r))
345     | "("; t = pat; ")" -> t ] ];
346 abate 4
347     expr_record_spec:
348     [ [ r = LIST1
349 abate 78 [ l = [LIDENT | UIDENT]; "="; x = expr ->
350     (Types.LabelPool.mk l,x) ]
351 abate 4 SEP ";" ->
352     mk loc (RecordLitt r)
353     ] ];
354    
355     expr_attrib_spec:
356     [ [ r = expr_record_spec -> r ]
357     | [ e = expr LEVEL "no_appl" -> e
358     | -> mk loc (RecordLitt [])
359     ]
360     ];
361     END
362    
363 abate 61 let pat' = Grammar.Entry.create gram "type/pattern expression"
364     EXTEND GLOBAL: pat pat';
365     pat': [ [ p = pat; EOI -> p ] ];
366     END
367    
368 abate 10 let pat = Grammar.Entry.parse pat
369 abate 81 and expr = Grammar.Entry.parse expr
370     and prog = Grammar.Entry.parse prog
371 abate 10
372     module From_string = struct
373 abate 61 let pat s = Grammar.Entry.parse pat' (Stream.of_string s)
374 abate 10 let expr s = expr (Stream.of_string s)
375 abate 4 end
376    

CVS Admin">CVS Admin
ViewVC Help
Powered by ViewVC 1.1.5