Guest User

Untitled

a guest
Jan 17th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. // parser = string -> [match, remainder]
  2.  
  3. // read single item
  4. function* item(s) {
  5. if (s.length > 0) yield [s[0], s.slice(1)];
  6. }
  7.  
  8. function run(p, s) {
  9. return [...p(s)]
  10. }
  11.  
  12. // function char(c) {
  13. // return function *(s) {
  14. // for (const [a, rest] of item(s)) {
  15. // if (a === c) {
  16. // yield [c, rest];
  17. // }
  18. // }
  19. // }
  20. // }
  21.  
  22. // function filter(pred, p) {
  23. // return function*(s) {
  24. // for (const [a, rest] of p(s)) {
  25. // if (pred(a)) {
  26. // yield [a, rest];
  27. // }
  28. // }
  29. // };
  30. // }
  31.  
  32. function* failure(s) {
  33. return;
  34. }
  35.  
  36. function filter(pred, p) {
  37. return flatMap(a => (pred(a) ? success(a) : failure), p);
  38. }
  39.  
  40. function char(c) {
  41. return filter(a => a === c, item);
  42. }
  43.  
  44. // function seq(p1, p2) {
  45. // return function*(s) {
  46. // for (const [a, rest1] of p1(s)) {
  47. // for (const [b, rest2] of p2(rest1)) {
  48. // yield [[a, b], rest2];
  49. // }
  50. // }
  51. // };
  52. // }
  53.  
  54. // function seq(p1, p2) {
  55. // return flatMap(a => map(b => [a, b], p2), p1);
  56. // }
  57.  
  58. function seq(...ps) {
  59. return sequence(ps);
  60. }
  61.  
  62. function sequence(ps) {
  63. if (ps.length === 0) return success([]);
  64. return flatMap(a => map(as => [a, ...as], sequence(ps.slice(1))), ps[0]);
  65. }
  66.  
  67. function alt(p1, p2) {
  68. return function* (s) {
  69. yield* p1(s);
  70. yield* p2(s);
  71. };
  72. }
  73.  
  74. function many(p) {
  75. return alt(success([]), defer(() => many1(p)));
  76. }
  77.  
  78. function success(v) {
  79. return function* (s) {
  80. yield [v, s];
  81. };
  82. }
  83.  
  84. function many1(p) {
  85. return map(([a, as]) => [a, ...as], seq(p, many(p)));
  86. }
  87.  
  88. // function map(f, p) {
  89. // return function*(s) {
  90. // for (const [a, rest] of p(s)) {
  91. // yield [f(a), rest];
  92. // }
  93. // };
  94. // }
  95. function map(f, p) {
  96. return flatMap(a => success(f(a)), p);
  97. }
  98.  
  99. function flatMap(f, p) {
  100. return function* (s) {
  101. for (const [a, rest] of p(s)) {
  102. yield* f(a)(rest);
  103. }
  104. };
  105. }
  106.  
  107. function defer(pf) {
  108. return function* (s) {
  109. yield* pf()(s);
  110. };
  111. }
  112.  
  113. // function wrap(body, p, s) {
  114. // return seq(char(p), seq(body, char(s)));
  115. // }
  116.  
  117. function wrap(body, p, s) {
  118. return seq(char(p), body, char(s));
  119. }
  120.  
  121. const parens = many(defer(() => paren));
  122. const p1 = wrap(parens, "(", ")");
  123. const p2 = wrap(parens, "[", "]");
  124. const p3 = wrap(parens, "{", "}");
  125. const paren = alt(p1, alt(p2, p3));
  126.  
  127. function isValid(s) {
  128. for (const [a, rest] of parens(s)) {
  129. if (rest === "") return true;
  130. }
  131. return false;
  132. }
  133.  
  134. console.log(isValid("{}"));
  135. console.log(isValid("()[]{}()"));
  136. console.log(isValid("[()]"));
  137. console.log(isValid("[(][)]"));
Add Comment
Please, Sign In to add comment