function _next()

in src/parser/WDL/hermes/wdl_parser.js [5684:5726]


function _next(ctx) {
  var tokens = []
  var mode = ctx.mode_stack[ctx.mode_stack.length - 1]
  for (var i = 0; i < regex[mode].length; i++) {
    var match = regex[mode][i].regex.exec(ctx.string);
    if (match != null && match.index == 0) {
      for (var j = 0; j < regex[mode][i].outputs.length; j++) {
        var terminal = regex[mode][i].outputs[j].terminal;
        var group = regex[mode][i].outputs[j].group;
        var func = regex[mode][i].outputs[j].function;
        var stack_push = regex[mode][i].outputs[j].stack_push;
        var action = regex[mode][i].outputs[j].action;
        if (stack_push !== undefined) {
          ctx.mode_stack.push(stack_push)
        } else if (action !== undefined) {
          if (action == 'pop') {
            ctx.mode_stack.pop()
          }
        } else {
          func = (func == null) ? default_action : func;
          var source_string = group != null ? match[group] : ""
          // Ugh!  JavaScript why you no have regex group indexes?!
          var group_line = ctx.line
          var group_col = ctx.col
          try {
            var mult_regex = new MultiRegExp(regex[mode][i].regex.source);
            var mult_groups = mult_regex.exec(ctx.string)
            if (group != null && group > 0) {
              var lc = advance_line_col(match[0], mult_groups[group-1].index, ctx.line, ctx.col)
              group_line = lc.line
              group_col = lc.col
            }
          } catch(err) {}
          // ^ Literally the worst thing ever
          func(ctx, terminal, source_string, group_line, group_col)
        }
      }
      advance_string(ctx, match[0])
      return true
    }
  }
  return false
}