1(* ========================================================================= *)
2(* PARSING                                                                   *)
3(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
4(* ========================================================================= *)
5
6signature Parse =
7sig
8
9(* ------------------------------------------------------------------------- *)
10(* A "cannot parse" exception.                                               *)
11(* ------------------------------------------------------------------------- *)
12
13exception NoParse
14
15(* ------------------------------------------------------------------------- *)
16(* Recursive descent parsing combinators.                                    *)
17(* ------------------------------------------------------------------------- *)
18
19(*
20  Recommended fixities:
21
22  infixr 9 >>++
23  infixr 8 ++
24  infixr 7 >>
25  infixr 6 ||
26*)
27
28val error : 'a -> 'b * 'a
29
30val ++ : ('a -> 'b * 'a) * ('a -> 'c * 'a) -> 'a -> ('b * 'c) * 'a
31
32val >> : ('a -> 'b * 'a) * ('b -> 'c) -> 'a -> 'c * 'a
33
34val >>++ : ('a -> 'b * 'a) * ('b -> 'a -> 'c * 'a) -> 'a -> 'c * 'a
35
36val || : ('a -> 'b * 'a) * ('a -> 'b * 'a) -> 'a -> 'b * 'a
37
38val first : ('a -> 'b * 'a) list -> 'a -> 'b * 'a
39
40val mmany : ('s -> 'a -> 's * 'a) -> 's -> 'a -> 's * 'a
41
42val many : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
43
44val atLeastOne : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
45
46val nothing : 'a -> unit * 'a
47
48val optional : ('a -> 'b * 'a) -> 'a -> 'b option * 'a
49
50(* ------------------------------------------------------------------------- *)
51(* Stream-based parsers.                                                     *)
52(* ------------------------------------------------------------------------- *)
53
54type ('a,'b) parser = 'a Stream.stream -> 'b * 'a Stream.stream
55
56val maybe : ('a -> 'b option) -> ('a,'b) parser
57
58val finished : ('a,unit) parser
59
60val some : ('a -> bool) -> ('a,'a) parser
61
62val any : ('a,'a) parser
63
64(* ------------------------------------------------------------------------- *)
65(* Parsing whole streams.                                                    *)
66(* ------------------------------------------------------------------------- *)
67
68val fromStream : ('a,'b) parser -> 'a Stream.stream -> 'b
69
70val fromList : ('a,'b) parser -> 'a list -> 'b
71
72val everything : ('a, 'b list) parser -> 'a Stream.stream -> 'b Stream.stream
73
74(* ------------------------------------------------------------------------- *)
75(* Parsing lines of text.                                                    *)
76(* ------------------------------------------------------------------------- *)
77
78val initialize :
79    {lines : string Stream.stream} ->
80    {chars : char list Stream.stream,
81     parseErrorLocation : unit -> string}
82
83val exactChar : char -> (char,unit) parser
84
85val exactCharList : char list -> (char,unit) parser
86
87val exactString : string -> (char,unit) parser
88
89val escapeString : {escape : char list} -> (char,string) parser
90
91val manySpace : (char,unit) parser
92
93val atLeastOneSpace : (char,unit) parser
94
95val fromString : (char,'a) parser -> string -> 'a
96
97(* ------------------------------------------------------------------------- *)
98(* Infix operators.                                                          *)
99(* ------------------------------------------------------------------------- *)
100
101val parseInfixes :
102    Print.infixes ->
103    (Print.token * 'a * 'a -> 'a) -> ('b,Print.token) parser ->
104    ('b,'a) parser -> ('b,'a) parser
105
106(* ------------------------------------------------------------------------- *)
107(* Quotations.                                                               *)
108(* ------------------------------------------------------------------------- *)
109
110type 'a quotation = 'a frag list
111
112val parseQuotation : ('a -> string) -> (string -> 'b) -> 'a quotation -> 'b
113
114end
115