Skip to content

Instantly share code, notes, and snippets.

@jooyunghan
Created January 12, 2018 13:13
Show Gist options
  • Save jooyunghan/f8d43b5eeed1c3ac7dfd4d4fe2b127fa to your computer and use it in GitHub Desktop.
Save jooyunghan/f8d43b5eeed1c3ac7dfd4d4fe2b127fa to your computer and use it in GitHub Desktop.
RD Parser for Parens (showing stack oveflow)
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)));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment