var GetBrace = function()

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;
  }