in src/parser/WDL/hermes/wdl_parser.js [433:476]
var GetBrace = function(text) {
var ret = {pos: -1, length: 0, text: '', children: [], type: 'brace'};
var openExp = /^(?:\\.|[^\)\\\(])*\(\?./;
var pre = 3;
var post = 1;
var m = openExp.exec(text);
if (m == null) {
m = /^(?:\\.|[^\)\\\(])*\(/.exec(text);
pre = 1;
}
if (m != null) {
ret.pos = m[0].length - pre;
ret.children = GetBraces(text.substring(m[0].length));
for (var i = 0; i < ret.children.length; i++) {
ret.children[i].pos += pre;
}
var closeExp = /^(?:\\.|[^\\\(\)])*\)/;
var closeExpAlt = /^(?:\\.|[^\\\(\)])*\)\?/;
var from = ret.children.length <= 0 ? ret.pos + pre :
ret.children[ret.children.length-1].pos +
ret.children[ret.children.length-1].length +
m[0].length - pre;
var m2 = closeExp.exec(text.substring(from));
var m3 = closeExpAlt.exec(text.substring(from));
if (m3 !== null && m3.length - 1 <= m2.length) {
m2 = m3;
post = 2;
}
if (m2 == null) {
return null;
} else {
ret.length = m2[0].length + from - ret.pos;
ret.text = text.substring(ret.pos, ret.pos + ret.length);
}
}
if (ret.text == '()' || /^\(\?.\)$/.test(ret.text)) {
throw 'empty braces not permitted';
}
if (ret.pos != -1) {
ret.pre = ret.text.substring(0, pre);
ret.post = ret.text.substring(ret.text.length - post, ret.text.length);
}
return ret.pos == -1 ? null : ret;
}