Advertisement
Guest User

Untitled

a guest
Jan 21st, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. struct Parser<Output> {
  2. let parse : (_ cs : [Character]) -> (value : Output, remainder : [Character])?
  3.  
  4. func parse(_ s : String) -> (value : Output, remainder : String)? {
  5. if let (v, rem) = parse(Array(s.characters)) {
  6. return (v, String(rem))
  7. } else {
  8. return nil
  9. }
  10. }
  11.  
  12. static func fail<A>() -> Parser<A> {
  13. return Parser<A> { _ in
  14. return nil
  15. }
  16. }
  17.  
  18. static func success(_ x : Output) -> Parser<Output> {
  19. return Parser { input in
  20. return (x, input)
  21. }
  22. }
  23.  
  24. static func item(_ pred : @escaping (Character) -> Bool) -> Parser<Character> {
  25. return Parser<Character> { input in
  26. if let first = input.first, pred(first) {
  27. return (first, Array(input.dropFirst()))
  28. } else {
  29. return nil
  30. }
  31. }
  32. }
  33.  
  34. // can be divided in two parts
  35.  
  36. static func first() -> Parser<Character> {
  37. return Parser<Character> { input in
  38. if let first = input.first {
  39. return (first, Array(input.dropFirst()))
  40. } else {
  41. return nil
  42. }
  43. }
  44. }
  45.  
  46. func satisfy(_ pred : @escaping (Output) -> Bool) -> Parser {
  47. return Parser { input in
  48. if let (v, rem) = self.parse(input), pred(v) {
  49. return (v, rem)
  50. } else {
  51. return nil
  52. }
  53. }
  54. }
  55.  
  56. static func character(_ c : Character) -> Parser<Character> {
  57. return Parser.first().satisfy({ $0 == c })
  58. }
  59.  
  60. /*
  61. func then<Output2>(_ p : Parser<Output2>) -> Parser<(Output, Output2)> {
  62. return Parser<(Output, Output2)> { input in
  63. if let (v1, rem1) = self.parse(input),
  64. let (v2, rem2) = p.parse(rem1) {
  65. return ((v1, v2), rem2)
  66. } else {
  67. return nil
  68. }
  69. }
  70. }
  71. */
  72.  
  73. func then<Output2, Output3>(_ p : Parser<Output2>,
  74. combine: @escaping (Output, Output2) -> Output3) -> Parser<Output3> {
  75. return Parser<Output3> { input in
  76. if let (v1, rem1) = self.parse(input),
  77. let (v2, rem2) = p.parse(rem1) {
  78. return (combine(v1, v2), rem2)
  79. } else {
  80. return nil
  81. }
  82. }
  83. }
  84.  
  85. func bind<Output2>(_ then : @escaping (Output) -> Parser<Output2>) -> Parser<Output2> {
  86. return Parser<Output2> { input in
  87. if let (v1, rem1) = self.parse(input) {
  88. return then(v1).parse(rem1)
  89. } else {
  90. return nil
  91. }
  92. }
  93. }
  94.  
  95. func or(_ p : Parser) -> Parser {
  96. return Parser { input in
  97. self.parse(input) ?? p.parse(input)
  98. }
  99. }
  100.  
  101. func optional() -> Parser<Output?> {
  102. return self.bind({ Parser<Output?>.success($0) })
  103. .or(Parser<Output?>.success(nil))
  104. }
  105.  
  106. func many() -> Parser<[Output]> {
  107. return Parser<[Output]> { input in
  108. if let (x, rem) = self.parse(input) {
  109. return self.many().bind({ Parser<[Output]>.success([x] + $0) }).parse(rem)
  110. } else {
  111. return ([Output](), input)
  112. }
  113. }
  114. }
  115. }
  116.  
  117. func fail<A>() -> Parser<A> {
  118. return Parser<Any>.fail()
  119. }
  120.  
  121. func success<A>(_ x : A) -> Parser<A> {
  122. return Parser<A>.success(x)
  123. }
  124.  
  125. func character(_ c : Character) -> Parser<Character> {
  126. return Parser<Any>.character(c)
  127. }
  128.  
  129. let p1 = (character("a").then(character("b")) { a,b in return String([a,b,a,b]) })
  130. print(p1.parse("abababahello") ?? "unparsed")
  131. print(p1.parse("acababahello") ?? "unparsed")
  132.  
  133. let p1b = character("a").bind { _ in
  134. return character("b")
  135. }
  136. print(p1b.parse("abababahello") ?? "unparsed")
  137. print(p1b.parse("acababahello") ?? "unparsed")
  138.  
  139. let p2 = (character("a").then(character("b")) { _,_ in return "found" }).many()
  140. print(p2.parse("abababahello") ?? "unparsed")
  141.  
  142. let p3 = character("a").or(character("b"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement