Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const FAIL = {};
- let _pos;
- let _input;
- function parse(input) {
- _input = input;
- _pos = 0;
- const r = parens();
- if (r === FAIL || _pos !== _input.length) throw new Error('parse error');
- return r;
- }
- function parens() {
- let result = [];
- while (true) {
- const r = paren();
- if (r === FAIL) break;
- result.push(r);
- }
- return result;
- }
- function paren() {
- let r;
- r = p1();
- if (r !== FAIL) return r;
- r = p2();
- if (r !== FAIL) return r;
- return p3();
- }
- function p1() {
- const p = _pos; // parsing position 을 저장한다.
- let r;
- let result = [];
- r = char('(');
- if (r !== FAIL) {
- result.push(r);
- r = parens(); // 바로 여기 재귀 호출!
- if (r !== FAIL) {
- result.push(r);
- r = char(')');
- if (r !== FAIL) {
- result.push(r);
- return result;
- }
- }
- }
- _pos = p;
- return FAIL;
- }
- function p2() {
- const p = _pos; // parsing position 을 저장한다.
- let r;
- let result = [];
- r = char('[');
- if (r !== FAIL) {
- result.push(r);
- r = parens(); // 바로 여기 재귀 호출!
- if (r !== FAIL) {
- result.push(r);
- r = char(']');
- if (r !== FAIL) {
- result.push(r);
- return result;
- }
- }
- }
- _pos = p;
- return FAIL;
- }
- function p3() {
- const p = _pos; // parsing position 을 저장한다.
- let r;
- let result = [];
- r = char('{');
- if (r !== FAIL) {
- result.push(r);
- r = parens(); // 바로 여기 재귀 호출!
- if (r !== FAIL) {
- result.push(r);
- r = char('}');
- if (r !== FAIL) {
- result.push(r);
- return result;
- }
- }
- }
- _pos = p;
- return FAIL;
- }
- function char(c) {
- if (_pos < _input.length && _input[_pos] === c) {
- _pos++;
- return c;
- }
- return FAIL;
- }
- function long(nest) {
- let s = '';
- for (let i = 0; i < nest; i++) {
- s = '(' + s + ')';
- }
- return s;
- }
- console.log(parse(long(10000)));
Add Comment
Please, Sign In to add comment