Advertisement
Guest User

Untitled

a guest
Jan 29th, 2015
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1.  
  2. datatype ('s, 'a) state = STATE of 's -> 's * 'a
  3.  
  4. type position =
  5. { line : int
  6. , pos : int
  7. }
  8.  
  9. fun position_to_str {line, pos} =
  10. Int.toString line ^ ": " ^ Int.toString pos
  11.  
  12. type 'a tracked = (position, 'a) state
  13.  
  14. datatype block
  15. = BLOCK of substring
  16. | EOF
  17.  
  18. datatype ('cont, 'res) coroutine
  19. = AWAIT of 'cont
  20. | STOP of 'res
  21.  
  22. and 'a parseResult
  23. = OK of 'a
  24. | EXPECTED of string
  25.  
  26. and 'a parser = PARSER of (block -> 'a parser, 'a parseResult) coroutine tracked
  27.  
  28. fun mapState (f : 'a -> 'b) (STATE sa : ('s, 'a) state) : ('s, 'b) state =
  29. STATE (fn s =>
  30. case sa s of
  31. (s, a) => (s, f a))
  32.  
  33. fun returnState (value : 'a) : ('s, 'a) state =
  34. STATE (fn s =>
  35. (s, value))
  36.  
  37. fun mapCoroutine
  38. (f : 'cont -> 'cont1)
  39. (g : 'res -> 'res1)
  40. (c : ('cont, 'res) coroutine)
  41. : ('cont1, 'res1) coroutine =
  42.  
  43. case c
  44. of AWAIT cont => AWAIT (f cont)
  45. | STOP res => STOP (g res)
  46.  
  47. val get : ('s, 's) state =
  48. STATE (fn s => (s, s))
  49.  
  50. fun modify (f : 's -> 's) : ('s, unit) state =
  51. STATE (fn s => (f s, ()))
  52.  
  53. fun return (value : 'a) : 'a parser =
  54. PARSER (returnState (STOP (OK value)))
  55.  
  56. fun expected (msg : string) : 'a parser =
  57. PARSER (returnState (STOP (EXPECTED msg)))
  58.  
  59. infix matched_as
  60. fun matched_as ((PARSER (STATE ma), amb) : 'a parser * ('a -> 'b parser)) : 'b parser =
  61. PARSER (STATE (fn position =>
  62. let
  63. val (newPos, action) = ma position
  64. in
  65. case action
  66. of AWAIT xma =>
  67. (newPos, AWAIT (fn block =>
  68. xma block matched_as amb
  69. ))
  70.  
  71. | STOP (OK a) =>
  72. (case amb a of
  73. PARSER (STATE sb) =>
  74. sb newPos)
  75.  
  76. | STOP (EXPECTED text) =>
  77. (newPos, STOP (EXPECTED text))
  78.  
  79. end
  80. ))
  81.  
  82. infix wraped_with
  83. fun wraped_with ((parser, f) : 'a parser * ('a -> 'b)) : 'b parser =
  84. parser matched_as (return o f)
  85.  
  86. infix catch
  87. fun catch
  88. ( (PARSER (STATE ma) , spmb)
  89. : 'a parser * (string * position -> 'a parser)
  90. )
  91. : 'a parser =
  92.  
  93. PARSER (STATE (fn position =>
  94. let
  95. val (newPos, action) = ma position
  96. in
  97. case action
  98. of AWAIT xma =>
  99. (newPos, AWAIT (fn block =>
  100. xma block catch spmb
  101. ))
  102.  
  103. | STOP (OK a) =>
  104. (newPos, STOP (OK a))
  105.  
  106. | STOP (EXPECTED text) =>
  107. (case spmb (text, newPos)
  108. of PARSER (STATE sa) =>
  109. sa position)
  110. end
  111. ))
  112.  
  113. infix being
  114. fun being ((msg, parser) : string * 'a parser) : 'a parser =
  115. parser catch (fn (err, at) =>
  116. expected (msg ^ " (" ^ err ^ " at " ^ position_to_str at ^ ")")
  117. )
  118.  
  119. fun zeroOrMore (parser : 'a parser) : 'a list parser =
  120. (parser matched_as (fn a =>
  121. zeroOrMore parser matched_as (fn az =>
  122.  
  123. return (a :: az))))
  124.  
  125. catch (fn _ => return [])
  126.  
  127. fun oneOrMore (parser : 'a parser) : 'a list parser =
  128. parser matched_as (fn a =>
  129. zeroOrMore parser matched_as (fn az =>
  130.  
  131. return (a :: az)))
  132.  
  133. fun maybe (parser : 'a parser) : 'a option parser =
  134. parser wraped_with SOME
  135. catch (fn _ => return NONE)
  136.  
  137. val getPosition : position parser =
  138. PARSER (STATE (fn position =>
  139. (position, STOP (OK position))
  140. ))
  141.  
  142. fun any_of (parsers : 'a parser list) : 'a parser =
  143. let
  144. fun collect_errors errors parsers =
  145. case parsers
  146. of (parser :: rest) =>
  147. parser catch (fn error =>
  148. collect_errors (error :: errors) rest
  149. )
  150. | [] =>
  151. expected (pack_errors errors)
  152.  
  153. and pack_errors errors =
  154. let
  155. infix further_than
  156. fun further_than
  157. ( {line = l1, pos = p1}
  158. , {line = l2, pos = p2}
  159. ) =
  160. l1 > l2 orelse (l1 = l2 andalso p1 > p2)
  161.  
  162. fun take_furthest ((e2, at2), list) =
  163. case list
  164. of (e1, at1) :: rest =>
  165. if at1 further_than at2
  166. then list
  167. else if at2 further_than at1
  168. then (e2, at2) :: rest
  169. else (e2, at2) :: list
  170.  
  171. | [] =>
  172. [(e2, at2)]
  173.  
  174. val far = foldl take_furthest [] errors
  175.  
  176. fun error_to_str (e, at) = e ^ " at " ^ position_to_str at
  177.  
  178. val text =
  179. "any of [" ^ String.concatWith ", "
  180. (map error_to_str far) ^
  181. "]"
  182. in
  183. text
  184. end
  185. in
  186. collect_errors [] parsers
  187. end
  188.  
  189. infix or
  190. fun or (l, r) = any_of [l, r]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement