source: Deliverables/D4.1/Parser.ml @ 130

Last change on this file since 130 was 130, checked in by mulligan, 10 years ago

Commit again? Not sure what happened. All Parser files were already
under SVN control.

File size: 1.3 KB
RevLine 
[130]1open Util;;
2open BitVectors;;
3open ASM;;
4
5type 'a parser = char list -> ('a * char list) list
6
7let return x =
8  fun y -> [(x, y)]
9
10let (>>=) f g =
11  fun x ->
12    let frst = f x in
13      List.concat $ List.map (fun (a, x') -> (g a) x') frst
14
15let prs_zero = fun x -> []
16;;
17
18let prs_predicate p =
19  function
20    hd::tl ->
21      if p hd then
22        [(hd, tl)]
23      else
24        []
25  | [] -> []
26;;
27
28let (++) f g =
29  fun x ->
30    f x @ g x
31;;
32
33let (+++) f g =
34  fun x ->
35    match (f ++ g) x with
36      [] -> []
37    | hd::tl -> [hd]
38;;
39
40let rec prs_many p =
41    prs_many1 p +++ return []
42and prs_many1 p =
43         p           >>=
44fun a -> prs_many p  >>=
45fun b -> return $ a::b
46;;
47
48let rec prs_exact i p =
49  if i = 0 then
50    return []
51  else
52         p                   >>=
53fun a -> prs_exact (i - 1) p >>=
54fun b -> return $ a::b
55
56let rec prs_sep_by p s =
57  prs_sep_by1 p s +++ return []
58and prs_sep_by1 p s =
59         p                             >>=
60fun a -> prs_many $ (s >>= fun _ -> p) >>=
61fun b -> return $ a::b
62
63
64let prs_char c = prs_predicate (fun x -> x = c)
65;;
66
67let prs_hex_digit =
68  prs_predicate
69    (fun x ->
70       x = '0' || x = '1' || x = '2' || x = '3' ||
71       x = '4' || x = '5' || x = '6' || x = '7' ||
72       x = '8' || x = '9' || x = 'A' || x = 'B' ||
73       x = 'C' || x = 'D' || x = 'E' || x = 'F')
74
Note: See TracBrowser for help on using the repository browser.