1(* ========================================================================= *)
2(* PARSER COMBINATORS                                                        *)
3(* Copyright (c) 2001-2004 Joe Hurd, distributed under the GNU GPL version 2 *)
4(* ========================================================================= *)
5
6signature Parser =
7sig
8
9(* Recommended fixities
10  infixr 9 >>++
11  infixr 8 ++
12  infixr 7 >>
13  infixr 6 ||
14*)
15
16(* ------------------------------------------------------------------------- *)
17(* Generic                                                                   *)
18(* ------------------------------------------------------------------------- *)
19
20exception Noparse
21
22val error : 'a -> 'b * 'a
23
24val ++ : ('a -> 'b * 'a) * ('a -> 'c * 'a) -> 'a -> ('b * 'c) * 'a
25
26val >> : ('a -> 'b * 'a) * ('b -> 'c) -> 'a -> 'c * 'a
27
28val >>++ : ('a -> 'b * 'a) * ('b -> 'a -> 'c * 'a) -> 'a -> 'c * 'a
29
30val || : ('a -> 'b * 'a) * ('a -> 'b * 'a) -> 'a -> 'b * 'a
31
32val smany : ('s -> 'a -> 's * 'a) -> 's -> 'a -> 's * 'a
33
34val many : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
35
36val atleastone : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
37
38val nothing : 'a -> unit * 'a
39
40val optional : ('a -> 'b * 'a) -> 'a -> 'b option * 'a
41
42(* ------------------------------------------------------------------------- *)
43(* Stream-based                                                              *)
44(* ------------------------------------------------------------------------- *)
45
46type ('a,'b) parser = 'a Stream.stream -> 'b * 'a Stream.stream
47
48val everything : ('a, 'b list) parser -> 'a Stream.stream -> 'b Stream.stream
49
50val maybe : ('a -> 'b option) -> ('a,'b) parser
51
52val finished : ('a,unit) parser
53
54val some : ('a -> bool) -> ('a,'a) parser
55
56val any : ('a,'a) parser
57
58val exact : ''a -> (''a,''a) parser
59
60(* ------------------------------------------------------------------------- *)
61(* Parsing and pretty-printing for infix operators                           *)
62(* ------------------------------------------------------------------------- *)
63
64type infixities = {tok : string, prec : int, left_assoc : bool} list
65
66val infix_toks : infixities -> string list
67
68val parse_infixes :
69    infixities -> (string * 'a * 'a -> 'a) -> (string,'a) parser ->
70    (string,'a) parser
71
72val pp_infixes :
73    infixities -> ('a -> (string * 'a * 'a) option) ->
74    (ppstream -> 'a * bool -> unit) -> ppstream -> 'a * bool -> unit
75
76end
77