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