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