Guest User

Untitled

a guest
Jan 22nd, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. const FAIL = {};
  2. let _pos;
  3. let _input;
  4.  
  5. function parse(input) {
  6. _input = input;
  7. _pos = 0;
  8. const r = parens();
  9. if (r === FAIL || _pos !== _input.length) throw new Error('parse error');
  10. return r;
  11. }
  12.  
  13. function parens() {
  14. let result = [];
  15. while (true) {
  16. const r = paren();
  17. if (r === FAIL) break;
  18. result.push(r);
  19. }
  20. return result;
  21. }
  22.  
  23. function paren() {
  24. let r;
  25. r = p1();
  26. if (r !== FAIL) return r;
  27. r = p2();
  28. if (r !== FAIL) return r;
  29. return p3();
  30. }
  31.  
  32. function p1() {
  33. const p = _pos; // parsing position 을 저장한다.
  34. let r;
  35. let result = [];
  36. r = char('(');
  37. if (r !== FAIL) {
  38. result.push(r);
  39. r = parens(); // 바로 여기 재귀 호출!
  40. if (r !== FAIL) {
  41. result.push(r);
  42. r = char(')');
  43. if (r !== FAIL) {
  44. result.push(r);
  45. return result;
  46. }
  47. }
  48. }
  49. _pos = p;
  50. return FAIL;
  51. }
  52.  
  53. function p2() {
  54. const p = _pos; // parsing position 을 저장한다.
  55. let r;
  56. let result = [];
  57. r = char('[');
  58. if (r !== FAIL) {
  59. result.push(r);
  60. r = parens(); // 바로 여기 재귀 호출!
  61. if (r !== FAIL) {
  62. result.push(r);
  63. r = char(']');
  64. if (r !== FAIL) {
  65. result.push(r);
  66. return result;
  67. }
  68. }
  69. }
  70. _pos = p;
  71. return FAIL;
  72. }
  73.  
  74. function p3() {
  75. const p = _pos; // parsing position 을 저장한다.
  76. let r;
  77. let result = [];
  78. r = char('{');
  79. if (r !== FAIL) {
  80. result.push(r);
  81. r = parens(); // 바로 여기 재귀 호출!
  82. if (r !== FAIL) {
  83. result.push(r);
  84. r = char('}');
  85. if (r !== FAIL) {
  86. result.push(r);
  87. return result;
  88. }
  89. }
  90. }
  91. _pos = p;
  92. return FAIL;
  93. }
  94.  
  95. function char(c) {
  96. if (_pos < _input.length && _input[_pos] === c) {
  97. _pos++;
  98. return c;
  99. }
  100. return FAIL;
  101. }
  102.  
  103. function long(nest) {
  104. let s = '';
  105. for (let i = 0; i < nest; i++) {
  106. s = '(' + s + ')';
  107. }
  108. return s;
  109. }
  110.  
  111. console.log(parse(long(10000)));
Add Comment
Please, Sign In to add comment