1(* ========================================================================= *)
2(* PARSER COMBINATORS                                                        *)
3(* Copyright (c) 2001-2004 Joe Hurd.                                         *)
4(* ========================================================================= *)
5
6signature mlibParser =
7sig
8
9(* Recommended fixities
10  infixr 9 >>++
11  infixr 8 ++
12  infixr 7 >>
13  infixr 6 ||
14*)
15
16type 'a pp = 'a mlibUseful.pp
17type 'a stream = 'a mlibStream.stream
18
19(* Generic *)
20exception Noparse
21val ++         : ('a -> 'b * 'a) * ('a -> 'c * 'a) -> 'a -> ('b * 'c) * 'a
22val >>         : ('a -> 'b * 'a) * ('b -> 'c) -> 'a -> 'c * 'a
23val >>++       : ('a -> 'b * 'a) * ('b -> 'a -> 'c * 'a) -> 'a -> 'c * 'a
24val ||         : ('a -> 'b * 'a) * ('a -> 'b * 'a) -> 'a -> 'b * 'a
25val smany      : ('s -> 'a -> 's * 'a) -> 's -> 'a -> 's * 'a
26val many       : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
27val atleastone : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
28val nothing    : 'a -> unit * 'a
29val optional   : ('a -> 'b * 'a) -> 'a -> 'b option * 'a
30
31(* mlibStream-based *)
32type ('a,'b) parser = 'a stream -> 'b * 'a stream
33val everything : ('a, 'b list) parser -> 'a stream -> 'b stream
34val maybe      : ('a -> 'b option) -> ('a,'b) parser
35val finished   : ('a,unit) parser
36val some       : ('a -> bool) -> ('a,'a) parser
37val any        : ('a,'a) parser
38val exact      : ''a -> (''a,''a) parser
39
40(* Parsing and pretty-printing for infix operators *)
41type infixities  = {tok : string, prec : int, left_assoc : bool} list
42type 'a con = string * 'a * 'a -> 'a
43type 'a des = 'a -> (string * 'a * 'a) option
44type 'a iparser = (string,'a) parser
45type 'a iprinter = ('a * bool) pp
46val optoks            : infixities -> string list
47val parse_left_infix  : string list -> 'a con -> 'a iparser -> 'a iparser
48val parse_right_infix : string list -> 'a con -> 'a iparser -> 'a iparser
49val parse_infixes     : infixities  -> 'a con -> 'a iparser -> 'a iparser
50val pp_left_infix     : string list -> 'a des -> 'a iprinter -> 'a iprinter
51val pp_right_infix    : string list -> 'a des -> 'a iprinter -> 'a iprinter
52val pp_infixes        : infixities  -> 'a des -> 'a iprinter -> 'a iprinter
53
54(* Lexing *)
55val space    : char -> bool
56val digit    : char -> bool
57val lower    : char -> bool
58val upper    : char -> bool
59val alpha    : char -> bool
60val alphanum : char -> bool             (* alpha + digit + _ + ' *)
61val symbol   : char -> bool             (* <>=-*+/\?@|!$%&~#^: *)
62val punct    : char -> bool             (* ()[]{}.,; *)
63
64(* Quotations *)
65type 'a quotation = 'a frag list
66val quotation_parser : (string -> 'a) -> 'b pp -> 'b quotation -> 'a
67
68end
69